Zielony Smok - logo witryny

JavaBeans. Wetowanie zmiany właściwości

Naszemu Smokowi – choremu na bulimię – musimy zastosować ogranicznik liczby kalorii.

Tworzymy klasę Smok:

package beans2;
import java.beans.*;
import java.io.*;
class Smok implements Serializable {
    private static final long serialVersionUID = -5793294036680820232L;
    private int liczbaKalorii;
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    private final VetoableChangeSupport vcs = new VetoableChangeSupport(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 synchronized void addVetoableChangeListener(
            VetoableChangeListener list3) {
        vcs.addVetoableChangeListener(list3);
    }
    public synchronized void removeVetoableChangeListener(
            VetoableChangeListener list4) {
        vcs.removeVetoableChangeListener(list4);
    }
    public int getLiczbaKalorii() {
        return liczbaKalorii;
    }
    public synchronized void setLiczbaKalorii(int newLiczbaKalori)
            throws PropertyVetoException {
        int oldValue = liczbaKalorii;
        vcs.fireVetoableChange("wartości poza dopuszczalnym przedziałem",
                Integer.valueOf(oldValue), Integer.valueOf(newLiczbaKalori));
        liczbaKalorii = newLiczbaKalori;
        pcs.firePropertyChange("zmiana liczby kalorii", Integer.valueOf(oldValue),
                Integer.valueOf(newLiczbaKalori));
    }
}

Aby obejrzeć Smoka w akcji uruchamiamy klasę Main, w której założyliśmy smokowi nie tylko śledzenie ilości pobieranego pokarmu, ale i ogranicznik, który odcina dopływ pokarmu, gdy smokowi grozi przejedzenie.

Ogranicznik jest dwustronny, na wypadek, gdyby smok wpadł w anoreksję.

package beans2;
import java.beans.*;
import java.util.Objects;
class Main {
    private final int min = 1000;
    private final int max = 20000;
    private Main() {
        Smok smok = new Smok();
        Objects.requireNonNull(smok).addPropertyChangeListener(evt -> {
            //Integer oldValue = (Integer) evt.getOldValue();
            Integer newValue = (Integer) evt.getNewValue();
            //System.out.println("oldValue: " + oldValue + " newValue: "
            //+ newValue);
            System.out.println(newValue);
        });
        smok.addVetoableChangeListener(evt -> {
            int val = (Integer) evt.getNewValue();
            if (val < min) {
                throw new PropertyVetoException(
                        "Stop. Smok zaraz umrze z głodu", evt);
            }
            if (val > max) {
                throw new PropertyVetoException(
                        "Stop. Smok zaraz pęknie z przejedzenia", evt);
            }
        });
        for (int i = 0; i < 25; i++) {
            try {
                smok.setLiczbaKalorii(i * 1000);
            } catch (PropertyVetoException e) {
                System.out.println(i + " " + e.getMessage());
                break;
            }
        }
    }
    public static void main(String[] args) {
        new Main();
    }
}

Teraz po przekroczeniu ustawionego limitu aparatura odcina smokowi jedzenie.

1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
11000
12000
13000
14000
15000
16000
17000
18000
19000
20000
21 Stop. Smok zaraz pęknie z przejedzenia