我对Java 8的'闭包'有些困惑。据说它可以封闭值。考虑以下类。
public class SomeClassWithLargeMemoryFootprint {
//some state
private SomeObject someObj;
//some more state
public void doSomething(SomeAsyncHelper helper) {
helper.doAsync( () -> {
//some super slow operation
int foo = someObj.whatever();
//some more stuff
});
}
}
.
//Let's assume SomeAsyncHelper.doAsync takes a VoidRunner that looks like below
interface VoidRunner {
void apply();
}
问题是,当异步帮助程序仍在工作时,SomeClassWithLargeMemoryFootprint的实例是否可以被GC删除? 对我来说,很明显“someObj”不能被GC删除,因为它是doSomething()中lambda所需的。 其余状态怎么样?
此外,请考虑以下变体,其中我们调用包含类的成员方法:
public class SomeClassWithLargeMemoryFootprint {
//some state
private SomeObject someObj;
//some more state
public void doSomething(SomeAsyncHelper helper) {
helper.doAsync( () -> {
//do something
memberMethod();
//do something else
});
}
private void memberMethod() {
//do something
}
}
现在是怎样的情况?'helper'如何知道如何执行"memberMethod"?它会获取到SomeClassWithLargeMemoryFootprint实例的引用吗?GC序列会是什么样子?