javabean之Constrained属性
一个JavaBean的constrained属性,是指当这个属性的值要发生变化时,与这个属性已建立了某种连接的其它Java对象可否决属性值的改变。constrained属性的监听者通过抛出PropertyVetoException来阻止该属性值 的改变。
测试代码:
package com.beans; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; import java.beans.VetoableChangeSupport; import java.util.HashSet; import java.util.Random; import java.util.Set; import junit.framework.TestCase; import static java.lang.System.out; import static java.lang.System.err; public class TestVetoableChange extends TestCase { public void testVetoableChange() { User user = new User(); UserListener listener = new UserListener(); user.addVetoableChangeListener(listener); user.addPropertyChangeListener(listener); Random random = new Random(); for (int i = 0; i < 10; i++) { try { user.setNumber(random.nextInt(10)); } catch (PropertyVetoException e) { err.println(e.getMessage()); } } } static class User { private int number; private VetoableChangeSupport vetoableChangeSupport = new VetoableChangeSupport(this); private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public int getNumber() { return number; } public void setNumber(int number) throws PropertyVetoException { vetoableChangeSupport.fireVetoableChange("number", this.number, number); propertyChangeSupport.firePropertyChange("number", this.number, number); this.number = number; } public void addVetoableChangeListener(VetoableChangeListener listener) { vetoableChangeSupport.addVetoableChangeListener(listener); } public void removeVetoableChangeListener(VetoableChangeListener listener) { vetoableChangeSupport.removeVetoableChangeListener(listener); } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } } static class UserListener implements VetoableChangeListener, PropertyChangeListener { private Set<Integer> numberSet = new HashSet<Integer>(); @Override public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { if (numberSet.contains(evt.getNewValue())) { throw new PropertyVetoException("contains", evt); } numberSet.add((Integer) evt.getNewValue()); out.println(evt.getNewValue()); } @Override public void propertyChange(PropertyChangeEvent evt) { out.println(evt.getOldValue() + "->" + evt.getNewValue()); } } }
如果包含某个数字,就抛异常。
                    
                
                
            
        
浙公网安备 33010602011771号