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