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

Xor*_*rty 4 java networking remoting equals

考虑这个界面:

public interface Listenable {
  void listen();
}
Run Code Online (Sandbox Code Playgroud)

考虑这个实现:

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

现在我正在通过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
}
Run Code Online (Sandbox Code Playgroud)

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

更新:

Stanard equals对我不起作用,因为实例是在不同的VM上(我提到远程处理),所以它无法工作.毕竟我会需要一些状态变量,或者建议在远程虚拟机上比较这些类的好处.我很抱歉混淆.

Col*_*inD 7

使监听器成为枚举单例:

public enum Listener implements Listenable {
  INSTANCE;

  public void listen() {
    System.out.println("I am listening");
  }
}
Run Code Online (Sandbox Code Playgroud)

然后将只有一个实例,Listener并保证相等.

您可能不希望暴露这样一个事实:您正在使用enumfor或甚至侦听器完全是单例.你可以做的是使用静态方法将enum作为某个类的私有内部枚举(称为Listenables,让我们说),并通过静态方法公开此实现:

public static Listenable printingListenable() {
  return Listener.INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)