constrained属性修改

有时候需要关注javabean的某些field的修改所关联的一些其他的东西(我个人认为是一些属性的限制)即(1)修改后做通知(2)是否可以拒绝修改。可以在setter里面做限制,这里我们可以做一些监听器(观察者模式)来搞定它。

可以看看c3p0 WrapperConnectionPoolDataSource,当修改了数据源配置项的时候,就会通知到Listener关联。

2个关注的接口:

  • VetoableChangeListener
     关注值是否可以拒绝修改
  • PropertyChangeListener
     关注值修改后的通知(反应)。

2个关注的support类

  • PropertyChangeSupport
  • VetoableChangeSupport
package com.demo.test;

import org.junit.*;

import java.beans.*;

/**
 * 测试VetoableChangeListener和PropertyChangeListener
 */
public class VetoableAndProChangTet {

    @org.junit.Test
    public void test() throws PropertyVetoException {
        VetoableChangeListener vcl = new VetoableChangeListener() {
            @Override
            public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
                Object newValue = evt.getNewValue();
                String propertyName = evt.getPropertyName();
                //reject规则 正则更好
                if("abc".equals(propertyName)){
                    throw new PropertyVetoException("",null);
                }
                System.out.println("property--->"+propertyName+",newValue--->"+newValue);
            }
        };
        PropertyChangeListener pcl = new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                Object newValue = evt.getNewValue();
                String propertyName = evt.getPropertyName();
                System.out.println("property--->"+propertyName+",newValue--->"+newValue);
            }
        };
        Subject s = new Subject();
        s.addPropertyChangeListener(pcl);
        s.addVetoableChangeListener(vcl);
        s.setContent("今天天气不错");
        s.setUserName("xiaohei");

    }

    /**
     * javabean
     */
    static class Subject{

        private String content="original content";  //constrained属性
        private String userName="original userName ";

        //support属性
        private VetoableChangeSupport vetoableChangeSupport = new VetoableChangeSupport(this);
        private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);


        public String getContent() {
            return content;
        }

        public void setContent(String content) throws PropertyVetoException {
            vetoableChangeSupport.fireVetoableChange("content",this.content,content);
            propertyChangeSupport.firePropertyChange("content",this.content,content);
            this.content = content;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }


        public void addVetoableChangeListener(VetoableChangeListener listener){
            vetoableChangeSupport.addVetoableChangeListener(listener);
        }

        public void addPropertyChangeListener(PropertyChangeListener listener){
            propertyChangeSupport.addPropertyChangeListener(listener);
        }

        @Override
        public String toString() {
            return "com.demo.test.VetoableAndProChangTet.Subject{" +
                    "userName='" + userName + '\'' +
                    ", content='" + content + '\'' +
                    '}';
        }
    }


}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,191评论 0 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,115评论 25 709
  • 每件事情的发生都有它不可避免的原因。 东野圭吾的小说总能够紧紧的扣住读者的心,让人在他巧妙的故事里迷失。 他总能从...
    正齐读道阅读 1,603评论 0 0
  • 我的脸上淌着别人的泪水 我的心里流着自己的血 我的嘴里发出呜咽的声音—— 是因为风儿停顿 太阳已沉落。 走过长满杂...
    当今麦田阅读 1,769评论 0 2

友情链接更多精彩内容