Я полагаю, что самое простое решение из всех них было немного упущено ...
В 95% случаев вам не нужно больше, чем это:
public class Aminal extends Observable {
public void doSomethingThatNotifiesObservers() {
setChanged();
notifyObservers(new Integer(42));
}
}
Полагаю, у вас не будет автоматического бокса, поэтому я создал объект Integer
, но отчасти класс Observable
относится к JDK1.0, поэтому он должен присутствовать в вашей версии Java.
При автобоксировании (в Java 1.5 и более поздних версиях) вызов notifyObservers
будет выглядеть следующим образом:
notifyObservers(42);
Чтобы перехватить отправленное событие, вам нужно реализовать интерфейс Observer
:
public class GetInt implements Observer {
@Override
public void update(Observable o, Object arg) {
if (arg instanceof Integer) {
Integer integer = (Integer)arg;
// do something with integer
}
}
}
Затем вы добавите GetInt
к классу Animal
:
Animal animal = new Animal();
GetInt getint = new GetInt();
animal.addObserver(getint);
Это все стандартная Java, а класс Observable
реализует всю необходимую вам обработку наблюдателя.
Если вам нужно иметь возможность вызывать Observable
извне, используйте решение Стива МакЛауда, но по моему опыту вы захотите, чтобы ваш класс обрабатывал то, что он знает, и позволял другим классам взаимодействовать с ним через Observer
интерфейсы.
Единственное, что вам нужно знать, это то, что вам нужно позвонить setChanged()
до того, как notifyObservers()
или Observable
не отправит никаких событий.
Я думаю, это так, что вы можете позвонить нескольким setChanged()
, а затем уведомить наблюдателей только один раз, сообщив им, что класс изменился, и предоставив им возможность выяснить, как.
Также хорошо удалить наблюдателя, когда класс, в котором он был создан, больше не нужен, чтобы не дать наблюдателю остаться в наблюдаемой. Просто сбор мусора классом наблюдателя не удалит его из наблюдаемого.
Если вы хотите наблюдать за классом по каждому объекту, я бы рекомендовал использовать PropertyChangeSupport
, как описано Адамски выше. Также есть VetoableChangeSupport
, который вы можете использовать, если хотите, чтобы слушатели могли блокировать изменения.