如果我使用新语法获得方法引用:
anObject::aMethod
我总是得到同一个对象吗?也就是说,我可以相信对同一方法的两个引用是相等的吗?
很高兴知道,例如,我是否计划将它们用作我可以添加和删除的 Runnable
回调:
someLibrary.addCallback(anObject::aMethod)
// later
someLibrary.removeCallback(sameObject::sameMethod)
这是否需要将引用保存在 Runnable
变量中以保持稳定?
最佳答案
JLS makes no promises关于你从方法引用表达式中得到的东西的身份或平等。
您可以运行一个快速测试:
Object obj = new Object();
IntSupplier foo = obj::hashCode;
IntSupplier bar = obj::hashCode;
System.out.println(foo == bar); // false
System.out.println(foo.equals(bar)); // false
但这当然取决于实现。
您可以使您的 lambda Serializable
并使用序列化表示来键入您的回调映射。见 How to serialize a lambda? .虽然这会起作用,但并不完全符合规范要求。
关于java - Java 方法引用稳定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50748534/