功能接口的行为和方法参考

时间:2015-10-07 21:12:01

标签: java generics java-8 functional-interface

当属于变量的方法的引用被破坏时会发生什么?

public class Hey{
    public double bar;

    public Hey(){
        bar = 2.0d;
    }

    public double square(double num){
        return Math.pow(num , bar);
    }
}

Function<Double, Double> square;
whatsGonnaHappen: {
    Hey hey = new Hey();
    square = hey::square;
}//is hey still kept around because its method is being referenced?

double ans = square.apply(23d);

2 个答案:

答案 0 :(得分:11)

Scope是一个编译时概念,用于控制源代码中名称的使用位置。 From the JLS

  

声明的范围是程序的范围   声明声明的实体可以使用a来引用   简单名称,只要它是可见的(§6.4.1)。

名称hey仅限于whatsGonnaHappen标记语句的主体这一事实与hey在运行时引用的实例是否为候选者无关垃圾收集(我认为是你担心的)。

关于变量捕获,是的,方法引用hey::square是对特定对象(hey引用的)的实例方法的引用,因此将捕获变量的值{ {1}}评估方法引用表达式以生成实例并在调用hey时使用它。

答案 1 :(得分:2)

您的方法参考基本上等同于这样做:

Hey hey = new Hey();
Function<Double, Double> square = new DoubleDoubleFunction(hey);

其中类DoubleDoubleFunction的定义如下

class DoubleDoubleFunction implements Function<Double, Double> {
    private final Hey hey;

    public DoubleDoubleFunction(Hey hey) {
        this.hey = hey;
    }

    @Override
    public Double apply(Double num) {
        return hey.square(num);
    }
}

换句话说,square包含对Hey的引用。

我不知道eclipse,但是使用IntelliJ,您可以轻松地将方法引用和lambdas转换为匿名/静态嵌套/内部类,以查看正在发生的事情。我发现这是一件非常有益的事情。