gpt4 book ai didi

Java:如何为真正没有任何状态的类编写适当的 equals 方法?

转载 作者:搜寻专家 更新时间:2023-11-01 01:11:26 25 4
gpt4 key购买 nike

考虑这个接口(interface):

public interface Listenable {
void listen();
}

考虑这个实现:

public class Listener implements Listenable {
public void listen() {
System.out.println("I am listening");
}
}

现在我正在通过 RMI 进行远程处理,并将此类的实例传递给服务器(不确定是否会产生一些黑魔法代理)。

到目前为止,我能够发明的唯一解决方案,我不得不说它非常愚蠢,就是将这段代码添加到 Listener 类中:

public class Listener implements Listenable {
private double id;
private Random rand = new Random();
public Listener() {
this.id = rand.nextDouble();
}
public void listen() {
System.out.println("I am listening");
}
public int hashCode() { ... } // calculate from id
// same for equals - compare by id
}

通常有效,但我们都知道这是多么邪恶:/应该如何处理这种情况?

更新:

Stanard equals 对我不起作用,因为实例在不同的 VM 上(我提到了远程处理),所以它不起作用。毕竟我需要一些状态变量,或者建议一些对在远程 VM 上比较此类类有用的东西。对于困惑,我深表歉意。

最佳答案

使监听器成为枚举单例:

public enum Listener implements Listenable {
INSTANCE;

public void listen() {
System.out.println("I am listening");
}
}

然后将只有一个Listener实例并且保证相等。

您可能不想公开您正在为此使用 enum 的事实,甚至根本不想公开监听器是单例的事实。您可以做的是使枚举成为某些具有静态方法(称为 Listenables,比方说)的类的私有(private)内部枚举,并通过静态方法公开此实现:

public static Listenable printingListenable() {
return Listener.INSTANCE;
}

关于Java:如何为真正没有任何状态的类编写适当的 equals 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6349014/

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