JavaBean
概念
JavaBean可以看成是一种编程约定,按照这种约定编写Java类,开发者之间就易于协作,而且代码也易于重用,并且有一些开发工具也能够识别JavaBean所定义的各种属性、方法和事件。
特点
- 这个类必须具有一个无参的构造函数
- 属性必须私有化
- 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
编写JavaBean
定义JavaBean属性
JavaBean属性 = 私有字段 + get方法 + set方法
private int field1;
private boolean field2;
public int getField1() {
return field1;
}
public void setField2(int field1) {
this.field1 = filed1
}
// boolean 类型的字段,其get方法格式为:isFieldName()
public boolean isField2() {
return field2;
}
public void setField2(boolean field2) {
this.field2 = field2;
}
// 只读属性没有set方法 ,只写属性没有get方法
索引属性:
private int[] lists;
public int[] getLists() {
return lists;
}
public void setLists(int[] lists) {
this.lists = lists;
}
public int getLists(int index) {
return lists[index];
}
public int setLists(int index, int value) {
lists[index] = value;
}
可绑定的属性:
为javaBean定义好一个可绑定的属性之后,就可以给它添加外部的监听器(即Listener),当属性发生改变就会得到通知。
java.beans包中包含了两个类型:PropertyChangeEvent和PropertyChangeListener。可以调用addPropertyChangeListener和removePropertyListener这两方法来为可绑定JavaBean属性添加或移除监听对象,当属性值发生变化时,JavaBean会触发一个PropertyChangeEvent事件,并通知所有注册的PropertyChangeListener。
java.beans包中还有一个PropertyChangeSupport类,使用它可以很方便地管理监听器对象,并且在需要时能随时触发事件
private String bindField = "hello";
// 用于触发事件
private PropertyChangeSupport listeners = new PropertyChangeSupport(this);
public String getBindField() {
return bindField;
}
public void setBindField(String bindField) {
String oldBindField = this.bindField;
this.bindField = bindField;
// 触发"属性值变更"事件
listeners.firePropertyChange("bindField",oldBindField,bindField);
}
// 添加和移除属性改变事件监听器
public void addPropertyChangeListener(PropertyChangeListener listener) {
listeners.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
listeners.removePropertyChangeListener(listener);
}
// 测试
public static void main(String[] args) {
BeanListener bl = new BeanListener();
bl.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String info = String.format("Propty: %s,Old Value:%s, new Value:%s",evt.getPropertyName(),evt.getOldValue().toString(),evt.getNewValue().toString());
System.out.println(info);
}
});
bl.steBindField("word");
bl.steBindField("nihaoa")
}
约束属性
约束属性时绑定属性的一种,你可以为约束属性添加一个或多个有"投票权"的监听器,当属性转字将要改变时,由这些监听器对象投票决定是否要这个值改变。如果监听器不同意这个值改变时,则应该抛出PropertyVetoException。在实际开发中,通常使用java.beans包中的VetoableChangeSupport 类来实现约束属性。
private int score = 9;
private VetoableChangeSupport vetoListeners = new VetoableChangeSupport(this);
public int getScore() {
return score;
}
public void setScore(int score) throws PropertyVetoException {
int oldScore = this.score;
// 通知"投票监听器" 进行投票,不同意这抛出PropertyVetoException异常
vetoListeners.fireVetoableChange("score", oldScore, score);
this.score = score;
}
// 添加和删除“投票监听器”
public void addVetoableChageListener(VetoableChangeListener listener) {
vetoListeners.addVetoableChangeListener(listener);
}
public void removeVetoableChangeListener(VetoableChangeListener listener) {
vetoListeners.removeVetoableChangeListener(listener);
}
// 注意 同一个属性,可以同时注册PropertyChangeListener和VetoableChangeListener,在触发事件时,注意要把后者放到前面,仅当值的改变“通过投票”后,才真正改变值并触发PropertyChange事件。
// 测试
// 添加一个成绩有效性的监听器
ConstrainsBean cb = new ConstrainsBean();
cb.addVetoableChageListener(new VetoableChangeListener() {
@Override
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
int newValue = Integer.parseInt(evt.getNewValue().toString());
String propertyName = evt.getPropertyName();
if (propertyName.equals("score") && (newValue < 0 || newValue >100)) {
throw new PropertyVetoException("有效成绩在0-100分之间",evt);
}
}
});
try{
cb.setScore(100);
System.out.println(cb.getScore());
}catch (PropertyVetoException e) {
e.printStackTrace();
}
}