Java: 在异步回调中使用 this.classVariable 和 classVariable 在内存管理方面有什么区别吗?
Java: Is there any difference in terms of memory management between using this.classVariable and classVariable in async callback?
当我们将局部变量传递给异步回调时,我们必须将它们声明为最终的(好吧,它们至少应该有效地最终)所有因为 Java 不能引用局部变量,因此它应该做一些“技巧”将本地对象的副本传递给内部 class。另一方面,成员变量确实存在于封闭对象的生命周期中,因此它们可以被内部 class 实例引用。因此,由于内部对象可以引用外部对象的 class 变量,我有一个问题 - 这两个代码片段
片段 1[ 在内存管理方面是否会有任何差异? =32=]
SomeHttpLib.getData(new OnReponseHandler() {
@Override
public void onResponse(String response) {
myClassVariable.doSomething()
}
})
片段 2
SomeHttpLib.getData(new OnReponseHandler() {
@Override
public void onResponse(String response) {
MyClass.this.myClassVariable.doSomething()
}
})
这两个片段之间的唯一区别是第二个片段通过 this
ref 访问 myClassVariable
,而第一个片段直接访问。因此,第一个示例似乎“捕获”了对 myClassVariable
的引用并阻止了对象被释放(或至少推迟了释放),但外部对象本身可以被释放!而第二个示例通过 this
ref 访问 myLocalVariable
,这使得回调捕获外部对象并因此延长其生命!那么,我是在以正确的方式进行推理,还是错过了什么?
请不要对我的问题做出过分的判断,我只是在学习Java 并试图了解事情是如何发生的
谢谢
亲切的问候,
Andre
没有区别,两个片段编译成完全相同的东西。
So, it seems that the first example "captures" the reference to myClassVariable and prevents the object from being deallocated(or at least postpones the deallocation), but the outer object itself can be released!
这不是它的工作原理。
myClassVariable
没有单独捕获,它仍然会引用对象的字段(外this
)并在回调运行时被解析,所以整个对象正在被还活着。
只有局部变量会被单独捕获(要实现这一点,它们需要有效 final
,因为它们在创建回调时的值会被捕获,而不是对它们的引用)。
当我们将局部变量传递给异步回调时,我们必须将它们声明为最终的(好吧,它们至少应该有效地最终)所有因为 Java 不能引用局部变量,因此它应该做一些“技巧”将本地对象的副本传递给内部 class。另一方面,成员变量确实存在于封闭对象的生命周期中,因此它们可以被内部 class 实例引用。因此,由于内部对象可以引用外部对象的 class 变量,我有一个问题 - 这两个代码片段
片段 1[ 在内存管理方面是否会有任何差异? =32=]
SomeHttpLib.getData(new OnReponseHandler() {
@Override
public void onResponse(String response) {
myClassVariable.doSomething()
}
})
片段 2
SomeHttpLib.getData(new OnReponseHandler() {
@Override
public void onResponse(String response) {
MyClass.this.myClassVariable.doSomething()
}
})
这两个片段之间的唯一区别是第二个片段通过 this
ref 访问 myClassVariable
,而第一个片段直接访问。因此,第一个示例似乎“捕获”了对 myClassVariable
的引用并阻止了对象被释放(或至少推迟了释放),但外部对象本身可以被释放!而第二个示例通过 this
ref 访问 myLocalVariable
,这使得回调捕获外部对象并因此延长其生命!那么,我是在以正确的方式进行推理,还是错过了什么?
请不要对我的问题做出过分的判断,我只是在学习Java 并试图了解事情是如何发生的
谢谢
亲切的问候,
Andre
没有区别,两个片段编译成完全相同的东西。
So, it seems that the first example "captures" the reference to myClassVariable and prevents the object from being deallocated(or at least postpones the deallocation), but the outer object itself can be released!
这不是它的工作原理。
myClassVariable
没有单独捕获,它仍然会引用对象的字段(外this
)并在回调运行时被解析,所以整个对象正在被还活着。
只有局部变量会被单独捕获(要实现这一点,它们需要有效 final
,因为它们在创建回调时的值会被捕获,而不是对它们的引用)。