在方法中使用匿名内部类时,当我们想在匿名内部类中使用方法参数时,我们必须将其标记为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属性将不是引用的副本,而是引用本身,因为一旦实际注入了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;
是否会设置为空?
答案 0 :(得分:4)
Inner class包含对其封闭实例的this
的隐式引用(即在其创建的上下文中声明类的实例),以便访问其中的字段声明类被视为该引用的正常字段访问。
因此,您的内部类将看到该字段的当前值,并且也可以更改它。