gpt4 book ai didi

java - final 变量都被匿名类捕获了吗?

转载 作者:太空狗 更新时间:2023-10-29 22:39:26 24 4
gpt4 key购买 nike

我以为我知道这个问题的答案,但经过一个小时左右的搜索后我找不到任何确认。

在这段代码中:

public class Outer {

// other code

private void method1() {
final SomeObject obj1 = new SomeObject(...);
final SomeObject obj2 = new SomeObject(...);
someManager.registerCallback(new SomeCallbackClass() {
@Override
public void onEvent() {
System.out.println(obj1.getName());
}
});
}
}

假设 registerCallback 将它的参数保存在某个地方,这样匿名子类的对象就会存活一段时间。显然,此对象必须维护对 obj1 的引用,以便 onEvent 在被调用时起作用。

但是鉴于对象不使用obj2,它是否仍然保持对obj2的引用,所以obj2不能在对象存在时被垃圾收集?我的印象是 all 可见的 final(或有效的 final)局部变量和参数被捕获,因此只要对象还活着就不能被 GC ,但我找不到任何说明这种情况的内容。

它是否依赖于实现?

JLS 中是否有一个部分可以回答这个问题?我在那里找不到答案。

最佳答案

语言规范几乎没有说明匿名类应如何从其封闭范围捕获变量。

我能找到的语言规范中唯一特别相关的部分是 JLS Sec 8.1.3 :

Any local variable, formal parameter, or exception parameter used but not declared in an inner class must either be declared final or be effectively final (§4.12.4), or a compile-time error occurs where the use is attempted.)

( Anonymous classes are inner classes )

它没有指定匿名类应该捕获哪些变量,或者应该如何实现捕获。

我认为可以从中推断出实现不需要捕获内部类中未引用的变量是合理的;但它并没有说他们不能。

关于java - final 变量都被匿名类捕获了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53203529/

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