如果父类不是,那么java 8方法引用是否可以被垃圾收集?

pra*_*ata 3 java java-8

如果我有

public interface Foo {
    public void oneMethod();
}
Run Code Online (Sandbox Code Playgroud)

然后我又上了一堂课:

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

可以sr.get()返回null吗?

也有兴趣知道在不使用方法引用而是使用匿名内部类或非静态内部类的情况下的行为.

Hol*_*ger 9

为方法引用创建的实例的生存时间不依赖于方法引用的目标.它始终是另一种方式,如果您的方法引用针对特定实例,只要方法引用实例可访问,目标实例就无法收集垃圾.

由于Java规范让它开放如何创建和重用lambda表达式和方法引用的实例,它也未指定,它们将存活多长时间(参见A:lambda表达式是否在每次执行时都在堆上创建一个对象?).

实际上,对于当前实现,不记录任何值的实例会被记住并重用,因此只要创建它们的类就可以存活.相反,捕获值并this::lalala捕获this引用值的实例不会被重用,并且一旦无法访问就会收集垃圾.