JavaBeans. Informowanie o zmianie właściwości
Załóżmy, że Smok leży w szpitalu i trzeba monitorować liczbę pobieranych kalorii, czyli przy każdym posiłku przekazywać informacje do pokoju lekarskiego.
Tworzymy klasę Smok.
package beans1; import java.beans.*; import java.io.*; class Smok implements Serializable { private static final long serialVersionUID = 6839349143399541342L; private int liczbaKalorii; private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); public Smok() { this(0); } private Smok(int liczbaKalorii) { this.liczbaKalorii = liczbaKalorii; } public synchronized void addPropertyChangeListener( PropertyChangeListener list1) { pcs.addPropertyChangeListener(list1); } public synchronized void removePropertyChangeListener( PropertyChangeListener list2) { pcs.removePropertyChangeListener(list2); } public int getLiczbaKalorii() { return liczbaKalorii; } public synchronized void setLiczbaKalorii(int newLiczbaKalorii) { int oldValue = liczbaKalorii; liczbaKalorii = newLiczbaKalorii; pcs.firePropertyChange("zmiana liczby kalorii", Integer.valueOf(oldValue), Integer.valueOf(newLiczbaKalorii)); } }
Aby obejrzeć Smoka w akcji uruchamiamy klasę Main
. W tej klasie założyliśmy smokowi podsłuch w postaci PropertyChangeListener
…
package beans1; class Main { private Main() { Smok smok = new Smok(); smok.addPropertyChangeListener(evt -> { Integer newValue = (Integer) evt.getNewValue(); System.out.println("liczba pobranych kalorii: " + newValue); }); for (int i = 0; i < 25; i++) { smok.setLiczbaKalorii(i * 1000); } } public static void main(String[] args) { new Main(); } }
I teraz wiemy już o smoku wszystko co chcieliśmy. Widzimy, że Smok pozostawiony bez nadzoru umrze z
przejedzenia.
liczba pobranych kalorii: 1000 liczba pobranych kalorii: 2000 liczba pobranych kalorii: 3000 liczba pobranych kalorii: 4000 liczba pobranych kalorii: 5000 liczba pobranych kalorii: 6000 liczba pobranych kalorii: 7000 liczba pobranych kalorii: 8000 liczba pobranych kalorii: 9000 liczba pobranych kalorii: 10000 liczba pobranych kalorii: 11000 liczba pobranych kalorii: 12000 liczba pobranych kalorii: 13000 liczba pobranych kalorii: 14000 liczba pobranych kalorii: 15000 liczba pobranych kalorii: 16000 liczba pobranych kalorii: 17000 liczba pobranych kalorii: 18000 liczba pobranych kalorii: 19000 liczba pobranych kalorii: 20000 liczba pobranych kalorii: 21000 liczba pobranych kalorii: 22000 liczba pobranych kalorii: 23000 liczba pobranych kalorii: 24000