Вы должны дать своему классу правильное имя (не Class1
), чтобы ваше намерение стало ясным. Может быть, вы хотите иметь счетчик?:
package so3274211;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class Counter {
private int value = 0;
private final List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
private void fireAfterValueChanged() {
for (Listener listener : listeners) {
listener.afterValueChanged(this);
}
}
public int getValue() {
return value;
}
public void increment() {
value++;
fireAfterValueChanged();
}
public void addListener(Listener listener) {
listeners.add(listener);
}
public void removeListener(Listener listener) {
listeners.remove(listener);
}
public interface Listener {
void afterValueChanged(Counter counter);
}
}
В обычном коде Java вы не можете напрямую слушать переменную. Но если вы поместите эту переменную в простой объект с надлежащими методами модификации (в данном случае increase()
), вы можете вызвать слушателей из этого метода.
Чтобы вызвать слушателя, нужно как-то его зарегистрировать. Обычно это реализуется с помощью простого List<Listener>
, и интерфейс к нему состоит из двух методов addListener(Listener)
и removeListener(Listener)
. Вы можете найти эту модель везде в AWT и Swing.
Я определил интерфейс Listener
внутри класса Counter
, потому что этот интерфейс не имеет большого значения вне этого класса, и я не хотел его называть CounterListener
. Таким образом, будет меньше .java
файлов, летающих вокруг.
Использование этого счетчика в реальной программе может выглядеть следующим образом:
package so3274211;
public class Main {
public static void main(String[] args) {
Counter c = new Counter();
c.increment();
c.addListener(new Counter.Listener() {
@Override
public void afterValueChanged(Counter counter) {
System.out.println(counter.getValue());
}
});
c.increment();
}
}
Сначала я создал счетчик, а затем добавил к нему слушателя. Выражение new Counter.Listener() { ... }
является определением анонимного класса, которое также часто встречается в программировании на Java.
Так что, если вы серьезно относитесь к программированию GUI, вам необходимо изучить эти концепции и методы реализации (инкапсуляция переменной в классе, добавление кода слушателя, определение слушателя, вызов слушателя из кода, который изменяет переменную).