Как создать событие при изменении переменной внутри класса объекта - PullRequest
2 голосов
/ 17 ноября 2011

Я застрял при реализации чего-либо в соответствии со следующим простым примером -

public class SimpleClass
{
    int test=0;
    AnotherClass anotherClass= new AnotherClass();

    public SimpleClass()
    {

    }

    public static void main(String[] args) 
        {
        SimpleClass simpleClass = new SimpleClass();
    }
}

public class AnotherClass
{
    int value=5;

    .
    .
    .
}

Я бы хотел, чтобы 'test' (скажем) увеличивался на 1 каждый раз, когда изменяется значение в anotherClass (anotherClass может получать информацию из потока данных или что-то в этом роде). Все документы о событиях оракула, которые я могу найти, относятся к компонентам свинга. Я нашел похожие запросы на помощь в этом онлайн, но ответы, похоже, не решили эту проблему.

Спасибо за любую помощь, которую вы можете предоставить! C

=============================================== ===================================

Добавление- (извините, оно не помещается в поля для комментариев-комментариев)

Спасибо за ваши предложения. Но если у меня есть класс A, в котором в качестве поля находится другой класс B, и я хочу (1) прослушать изменения в поле класса B (скажем, int var), и (2) обнаружить эти изменения на На уровне класса A полученное событие запускает метод класса A, для меня не очевидно, что этот подход будет работать.

Ибо, если я помещу своего слушателя в класс А, я не могу указать, чтобы прослушивать изменения в "B.var" отсюда. И наоборот, если я помещу своего слушателя в класс B, который является полем класса A, тогда он сможет обнаруживать изменения в var, но как я могу заставить это срабатывать и вносить изменения в классе A, потому что B сидит в классе A как поле, и не «осведомлены» о существовании класса A?

Одним из решений было бы включение всех полей и методов B в A. Однако, в конечном счете, я хотел бы иметь B в качестве статического класса и иметь много разных A, при этом каждый A прослушивал немного разные события в B. Картинка, которую я имею в виду в своей голове, состоит из множества разных людей, которые слушают соотношение, которое транслирует много разных слов. Каждый человек следит за тем, чтобы его собственное слово появилось по радио, и каждый раз, когда его слово встречается, они ставят проверку на своей стене (или увеличивают какое-то поле, которое у них есть ..)

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Подумайте, как эта проблема решается в Swing.Это шаблон наблюдателя.

class A implements ChangeListener{

    private B aB;

    public A(){
        aB = new B();
        aB.addListener(this);
    }

    public void thingyChanged(String newThingy){
        System.out.println("Thingy changed to:" + newThingy);
    }
}

class B {

    private Collection<ChangeListener> listeners = new LinkedList<ChangeListener>();

    public B(){}

    public void addListener(ChangeListener listener){
        listeners.add(listener)
    }

    public void changeThingy(String newThingyVal){
        doSomething(newThingyVal);
        for(ChangeListener listener:listeners){
            listener.thingyChanged(newThingyVal);
        }
    }

}

interface ChangeListener{
    public void thingChanged(String newThingy);
}

Примечание: не компилировал ни это, ни что-либо.

Это называется шаблоном наблюдателя.Вы используете интерфейс для создания обратного вызова.

http://en.wikipedia.org/wiki/Observer_pattern

0 голосов
/ 17 ноября 2011

Возможен вариант реализации вашего класса в виде JavaBean, а затем реализации PropertyChangeListener

Краткий обзор этой техники.

...