Подтвердить что ты не робот

Как создать прослушиватель изменений для переменной?

Скажем, у меня есть переменная, определенная с помощью оператора int someVariable;. Пока код запускается, изменяется значение переменной.

Как я могу отслеживать изменения этой переменной? Как я мог реализовать некоторый Listener, который ведет себя как onSomeVariableChangedListener?

Мне также нужно знать, когда был выполнен какой-либо другой метод на одной странице, поэтому я могу установить Listener в другом классе.

4b9b3361

Ответ 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);
  }
}

Ответ 5

В Java нет встроенного способа для получения уведомления, если значение любой произвольной переменной изменяется или если был вызван какой-либо метод.