gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:23:43 25 4
gpt4 key购买 nike

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

但是当使用类属性而不是方法局部属性时会发生什么?

简单用例:带有 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 通过二传手

因此我猜想,当函数首先被初始化时,函数内部使用的 lovValueDAO 属性将不是引用的副本而是引用本身,因为一旦 DAO 被真正注入(inject)它就可以正常工作。

我说的对吗?


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

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 吗?

最佳答案

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

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

关于java - 实例属性的匿名内部类声明,使用另一个实例属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11882704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com