在方法内部使用匿名内部类时,当我们要在匿名内部类内部使用方法参数时,必须将其标记为final。这里有一些细节: 为什么我们在匿名内部类中使用 final 关键字?
但是当使用类属性而不是方法本地属性时会发生什么?
简单用例:具有 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;
}
声明这样的 Guava 函数是否安全?根据我的测试,它工作正常,但引擎盖后面会发生什么?
初始化顺序为:
- 函数已初始化
- lovValueDAO 由 spring 通过 setter 注入
因此我猜想,当函数首先被初始化时,函数内部使用的 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;
会设置为 null 吗?