2

在方法内部使用匿名内部类时,当我们要在匿名内部类内部使用方法参数时,必须将其标记为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 吗?

4

1 回答 1

4

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

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

于 2012-08-09T12:03:13.123 回答