Как создать прослушиватель изменений для переменной?
Скажем, у меня есть переменная, определенная с помощью оператора int someVariable;
. Пока код запускается, изменяется значение переменной.
Как я могу отслеживать изменения этой переменной? Как я мог реализовать некоторый Listener, который ведет себя как onSomeVariableChangedListener?
Мне также нужно знать, когда был выполнен какой-либо другой метод на одной странице, поэтому я могу установить Listener в другом классе.
Ответы
Ответ 1
Это одна из многих причин, позволяющих скрыть переменные, стоящие за парами setter/getter. Затем в установщике вы можете уведомить своего слушателя, что эта переменная была соответствующим образом изменена. Как прокомментировали другие, нет встроенного способа сделать именно то, что вы хотите, вам нужно реализовать его самостоятельно.
В качестве альтернативы Бенджамин поднимает интересный шаблон, называемый шаблоном Decorator, который может быть вам полезен, если этот код не может быть изменен. Вы можете найти дополнительную информацию по википедии.
Идея состоит в том, чтобы создать совместимую оболочку вокруг объекта. Допустим, ваш объект относится к типу MyClass.
class MyClass{
publc void doFunc(){...}
}
class MyLoggedClass extends MyClass{
MyClass myObject;
publc void doFunc(){
//Log doFunc Call
myObject.doFunc();
}
}
вместо
MyClass object = new MyClass();
Вы использовали бы
MyClass object = new MyLoggedClass(new MyClass());
Теперь ваш остаток кода будет использовать объект как нормальный, за исключением того, что каждый вызов функции будет зарегистрирован или уведомлен и т.д.
Как вы увидите в wikipedia, это обычно делается через интерфейс, на который наследуется класс, о котором идет речь, но это может быть невозможно в вашем случае.
Ответ 2
Java дает вам простую реализацию шаблона Observer для такого рода вещей, но вам нужно будет установить наблюдаемую переменную в методе, который управляет уведомлениями слушателя. Если вы не можете расширить Observable, вы можете либо использовать композицию (т.е. Иметь экземпляр Observable в своем классе для управления уведомлениями), либо вы можете взглянуть на java.util.Observable, чтобы получить представление о том, как сворачивать ваши собственные версия.
Flux.java
import java.util.Observable;
public class Flux extends Observable {
private int someVariable = 0;
public void setSomeVariable(int someVariable) {
synchronized (this) {
this.someVariable = someVariable;
}
setChanged();
notifyObservers();
}
public synchronized int getSomeVariable() {
return someVariable;
}
}
Heraclitus.java
import java.util.Observable;
import java.util.Observer;
public class Heraclitus implements Observer {
public void observe(Observable o) {
o.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
int someVariable = ((Flux) o).getSomeVariable();
System.out.println("All is flux! Some variable is now " + someVariable);
}
}
Ответ 3
Как написать прослушиватель изменений свойств может помочь вам
Это что-то связанное
Ответ 4
Я считаю, что вам придется реализовать шаблон наблюдателя.
Ответ 5
В Java нет встроенного способа для получения уведомления, если значение любой произвольной переменной изменяется или если был вызван какой-либо метод.