2016-03-02 2 views
0

Так что я действительно хотел бы каким-то образом обнаружить изменения полей определенного объекта. Я давно искал Google, но ничего не нашел. Поэтому в основном все, что мне нужно знать, это когда какая-то переменная объекта изменилась. позволяет взять этот класс, например:java Слушатель смены поля

public class Example{ 
    String text = "test"; 

    public static void main(String[] args){ 
     Example e = new Example(); 
     e.text = "something else"; 
    } 
} 

В основном я хотел бы определить, когда изменилась переменная «текст». Я знаю, что многие из вас говорят, что используют геттеры и сеттеры и тому подобное, но это не то, что я хочу.

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

Итак, я надеюсь, что есть способ просто создавать слушатели для изменения полей, знает ли кто-нибудь о библиотеках/системах/методах для этого?

+0

Вы ищете прослушиватель * *, но AFAIK в Java нет такой вещи. Вероятно, единственный способ - использовать оживленный поток, как вы упомянули. Или, может быть, вы можете подклассировать It и использовать подход собственности? –

ответ

2

Давайте принесем это назад к жизни :)

Есть несколько подходов:

Первый, который я считаю, работает как с тех пор Java 6, заключается в использовании Bound Properties inside Java Beans (да, он также работает в JavaSE).

Связанное свойство уведомляет слушателей, когда изменяется его значение. Это имеет два значения:

Класс bean включает в себя методы addPropertyChangeListener() и removePropertyChangeListener() для управления слушателями bean-компонентов. При изменении связанного свойства компонент отправляет PropertyChangeEvent своим зарегистрированным слушателям. PropertyChangeEvent и PropertyChangeListener живут в пакете java.beans.

В пакет java.beans также входит класс PropertyChangeSupport, который выполняет большую часть работы связанных свойств. Этот удобный класс отслеживает прослушиватели свойств и включает удобный метод, который запускает события изменения свойств всем зарегистрированным слушателям.

Во втором случае вы получаете большинство вещей бесплатно, его на Java 7 (javafx 2.0) и it's called JavaFX Properties.

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

Недостатком последнего является то, что JPA не дружит с этим, поэтому его немного боль, чтобы заставить его работать.

+0

Оба ваши решения касаются * свойства * смена слушателей, а не * поля *. –

+0

@MicheleMariotti: OP говорит: «Так что в основном все, что мне нужно знать, это когда какая-то переменная класса изменилась». Если он определяет varibles как типы собственности, он может пузырить событие вне класса, или, как я полагаю. –

+0

Тем не менее, OP говорит: * Я знаю, что многие из вас говорят, что используют геттеры и сеттеры и тому подобное, это не то, что я хочу, но *. Ну, свойства основаны на ** геттерах и сеттерах **. В первой ссылке, которую вы опубликовали, четко указано **: * Чтобы определить свойство в классе bean, предоставляйте общедоступные методы getter и setter *. –

Смежные вопросы