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());  
        }  
  
    }  
}  

 

如果包含某个数字,就抛异常。

posted on 2018-02-24 15:20  腾飞的鹰  阅读(130)  评论(0)    收藏  举报

导航