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上(我提到远程处理),所以它无法工作.毕竟我会需要一些状态变量,或者建议在远程虚拟机上比较这些类的好处.我很抱歉混淆.
使监听器成为枚举单例:
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)
| 归档时间: |
|
| 查看次数: |
873 次 |
| 最近记录: |