Рассмотрим этот интерфейс:
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 не работал для меня, потому что экземпляры находятся на разных виртуальных машинах (я упомянул удаленное взаимодействие), поэтому он не мог работать.В конце концов, мне понадобится некоторая переменная состояния или предложит что-то хорошее для сравнения таких классов на удаленных виртуальных машинах.Я очень сожалею о путанице.