我有一个包含以下代码的方法:
public void myMethod(){
final MyDto expectedtDto = new MyDto();
MyRepository reposWithMock = new MyRepository(){
protected MyDao createDao(){
return new MyDao() {
public MyDto someMethod(){
return expectedtDto;
}
};
}
};
reposWithMock.doSomethingWithDao();
}
MyRepository.createDao()
是从 MyRepository
的构造函数调用的。
MyDao.someMethod()
是从 MyRepository.doSomethingWithDao()
调用的。
但是,MyDao().someMethod()
返回 null
而不是 expectedDto
知道这是为什么吗?
为了澄清,一些实际的工作代码:
package nl.tests;
public class TestAnon {
static class MyDao {
private int value;
public MyDao(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
static class Repository {
private MyDao dao;
public Repository() {
dao = createDao();
}
protected MyDao createDao(){
return new MyDao( 4 );
}
public MyDao getDao(){
return dao;
}
}
public static void main(String[] args) {
final MyDao testDao = new MyDao(8);
Repository repos = new Repository() {
protected MyDao createDao() {
if ( testDao == null ) {
System.out.println( "Error ");
return new MyDao(0);
}
return testDao;
}
};
System.out.println( "Dao :" + repos.getDao().getValue() );
}
}
这会导致:
Error
Dao :0
一些附加信息:我目前(必须)使用 java 1.4。 我的开发环境是 Rational Application Developer 7。
给定(和接受的答案)的附录。对于下面的代码,我已将 createDao() 方法公开:
public static void main(final String[] args) {
final MyDao testDao = new MyDao(8);
Repository repos = new Repository() {
public MyDao createDao() {
if ( testDao == null ) {
System.out.println( "Error ");
return new MyDao(0);
}
return testDao;
}
};
System.out.println( "Dao :" + repos.getDao().getValue() );
System.out.println( "Dao :" + repos.createDao().getValue() );
}
返回:
Error
Dao :0
Dao :8
最佳答案
在 Java 1.4 中失败,因为在执行 Repository 的 super 构造函数时,包含局部变量的字段尚未初始化。
它适用于 Java 1.5 及更高版本,因为这样该字段会在调用 super 构造函数之前初始化。
一般来说,在构造函数中调用可能在子类中重写的方法是不好的风格,因为它会导致此类问题。
关于java - 在匿名内部类中使用最终对象会导致 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1782394/