当属于变量的方法的引用被破坏时会发生什么?
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);
答案 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转换为匿名/静态嵌套/内部类,以查看正在发生的事情。我发现这是一件非常有益的事情。