使用另一个实例属性的实例属性的匿名内部类声明

时间:2012-08-09 11:45:17

标签: java spring guava scjp

在方法中使用匿名内部类时,当我们想在匿名内部类中使用方法参数时,我们必须将其标记为final。 这里有一些细节: Why do we use final keyword with anonymous inner classes?

但是使用class属性而不是方法local属性会发生什么?

简单用例:具有Guava函数的Spring服务:

protected LovValueDAO lovValueDAO;

private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() {
    @Override
    public LovValue apply(String input) {
        return lovValueDAO.findById(input);
    }
};

@Required
public void setLovValueDAO(LovValueDAO lovValueDAO) {
    this.lovValueDAO = lovValueDAO;
}

声明这样的番石榴功能是否安全? 根据我的测试,它工作得很好,但引擎盖后面会发生什么?

初始化顺序为:

  • 功能已初始化
  • lovValueDAO是通过春天注入的 设定器

因此,我猜测,首先初始化函数,函数内部使用的lovValueDAO属性将不是引用的副本,而是引用本身,因为一旦实际注入了DAO,它就可以正常工作。

我是对的吗?


如果我使用此代码会发生什么:

private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() {
    @Override
    public LovValue apply(String input) {
        return lovValueDAO = null;
    }
};

调用函数后,我的外部属性protected LovValueDAO lovValueDAO;是否会设置为空?

1 个答案:

答案 0 :(得分:4)

Inner class包含对其封闭实例this的隐式引用(即在其创建的上下文中声明类的实例),以便访问其中的字段声明类被视为该引用的正常字段访问。

因此,您的内部类将看到该字段的当前值,并且也可以更改它。