如果我有
public interface Foo {
public void oneMethod();
}
然后我又开了一个班:
public class TestClass {
SoftReference sr;
public test() {
doSomething(this::lalala);
}
public lalala() {
}
public doSomethingFoo(Foo foo) {
sr = new SoftReference(foo);
//can sr.get() ever return null?
}
}
sr.get()
可以返回null吗?
还有兴趣知道在使用匿名内部类或非静态内部类而不是方法引用的情况下的行为。
答案 0 :(得分:9)
为方法引用创建的实例的生命周期不依赖于方法引用的目标。它始终是另一种方式,如果您的方法引用针对特定实例,只要方法引用实例可以访问,目标实例就无法收集垃圾。
由于Java规范让它打开了如何创建和重用lambda表达式和方法引用的实例,它还没有指定,它们将存活多长时间(见A:Does a lambda expression create an object on the heap every time it's executed?)。
实际上,对于当前的实现,不记录任何值的实例会被记住并重用,因此只要创建它们的类就可以存活。相反,捕获值的实例和this::lalala
捕获this
引用的值的实例不会被重用,并且一旦无法访问就会收集垃圾。