java - 在匿名内部类中使用最终对象会导致 null

标签 java

我有一个包含以下代码的方法:

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/

相关文章:

java - 使用 inputMap 过滤列表(List1)中的数据(键和值可能因每个请求而异)

java - 查找所有方法调用

java - 无法从文档读取架构文件

java - 带有 axis2 的双向 ssl 导致读取超时

java - 为什么 Thread 类中的 setName 分配给字符数组?为什么不是字符串?

java - 我们如何使用Java SDK从S3存储桶下载没有文件夹的多个文件

java - 在 Hadoop 作业中输出键类或值类是强制性的还是可选的?

java - 过滤响应只返回部分内容

java - Vaadin布局扩展

java - 如果我在遍历队列时将对象添加到队列中,是否会收到 ConcurrentModificationException 异常?