【发布时间】:2015-05-11 04:27:59
【问题描述】:
我不确定如何确定函数接口的相等性/不变性。 我想当我在 java 8 中使用这种语法糖时可能无法确保相等,如果您有任何提示,请告诉我。
我为我的问题做了一个简短的代码 sn-p。
public interface Element {
void doSomething(int a);
}
我已经尝试以功能方式添加此接口的实例
public class FunctionSet {
public void doubleUp(int a) {
System.out.println(a*2);
}
public void square(int a) {
System.out.println(a*a);
}
public static void main(String[] args) {
HashSet<Element> set = new HashSet<>();
FunctionSet functionSet = new FunctionSet();
set.add(functionSet::doubleUp);
set.add(functionSet::square);
System.out.println(set.add(functionSet::doubleUp));
}
}
它打印为 true,这意味着没有任何相等性检查,而且一旦我添加它,我就无法从 Set 中删除任何实例。
如果我使用函数式接口作为参数,有什么方法可以比较这些实例吗?
将不胜感激任何帮助,在此先感谢!
【问题讨论】:
-
可变性由状态决定。当一个对象没有状态时(即,当它没有实例字段时),那么它就不能是可变的。因此,无状态对象,例如大多数(全部?)lambdas 总是不可变的。不可变对象可以而且应该是单例,因为它们的状态永远不会改变,但是可以在不同的内存地址有两个原本相同的不可变对象......这将产生两个具有不同身份的等效对象。
-
简短回答:不,您不能测试来自不同代码位置的两个 lambda 表达式是否相等。
-
@Louis Wasserman:代码位置无关紧要,正确的答案是,即使在相同的代码位置实例化,您也无法测试两个 lambda 表达式是否相等。虽然它在某些情况下可能看起来有效,但这是依赖于实现的行为。
标签: java java-8 immutability equality functional-interface