gpt4 book ai didi

java - 为什么方法引用不是单例的?

转载 作者:IT老高 更新时间:2023-10-28 20:41:32 27 4
gpt4 key购买 nike

在 Java 中,以下代码在两个查询中都返回 false。为什么?方法引用是单例的不是更简单吗?它肯定会使附加和分离监听器变得更加简单。由于您需要为任何需要进行等价检查的方法引用保持一个常量,因此您不能只在每个必要的位置使用方法引用运算符。

public class Main {

public Main() {
// TODO Auto-generated constructor stub
}

public void doStuff() {

}

public static void main(String[] args) {
Main main = new Main();
Runnable thing1 = main::doStuff;
Runnable thing2 = main::doStuff;
System.out.println(thing1 == thing2); // false
System.out.println(thing1.equals(thing2)); // false
}

}

最佳答案

对于 instance 方法,我认为缓存它们没有意义。您必须为每个实例缓存一个方法......这意味着与该方法关联的类中的一个额外字段 - 每个公共(public)方法一个,大概是因为可以从类外部引用这些方法 - 或者缓存在方法引用的用户,在这种情况下,您需要某种实例缓存。

我认为缓存对 static 方法的方法引用更有意义,因为它们将永远相同。但是,要缓存实际的 Runnable,您需要针对它所针对的每种类型进行缓存。例如:

public interface NotRunnable {
void foo();
}

Runnable thing1 = Main::doStuff; // After making doStuff static
NotRunnable thing2 = Main::doStuff;

thing1thing2 在这里应该相等吗?如果是这样,编译器如何知道要创建什么类型?它可以在这里创建两个实例并分别缓存它们 - 并且始终在使用点而不是方法声明点进行缓存。 (您的示例具有声明方法并引用它的相同类,这是一种非常特殊的情况。您应该考虑它们不同的更一般情况>)

JLS 允许缓存方法引用。来自 section 15.13.3 :

Next, either a new instance of a class with the properties below is allocated and initialized, or an existing instance of a class with the properties below is referenced.

...但即使对于静态方法,似乎 javac 目前也没有做任何缓存。

关于java - 为什么方法引用不是单例的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27616490/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com