Zielony Smok - logo witryny

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