博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用建造者模式(Builder Pattern)创建不可变类
阅读量:4151 次
发布时间:2019-05-25

本文共 2444 字,大约阅读时间需要 8 分钟。

这篇文章中,我们将看到如何使用建造者模式创建不可变类。当构造器中的参数很多时,并且参数的顺序会给人造成困扰的时候,那么使用建造者模式来创建不可变类就是非常好的方法了。

 

使用建造者模式来创建不可变类

下面是使用建造者模式来创建不可变类的例子:

package cn.cd.sg.test.qita2;import java.util.HashMap;/*** 描述:使用建造者模式来创建不可变类* 项目名称:utils   * 类名称:ImmutableClass   * 创建人:孙刚   * 创建时间:2014-2-11 下午04:53:57   * 修改人1:xxx     * 修改时间1:xxxx-xx-xx * 修改备注:   * @version  1.0 */public class ImmutableClass {		//必须字段    private int id;    private String name;        //可选字段    private HashMap properties;    private String company;                	public ImmutableClass(ImmutableClassBuilder builder) {		this.id = builder.id;		this.name = builder.name;		this.properties = builder.properties;		this.company = builder.company;	}		public int getId() {        return id;    }     public String getName() {        return name;    }     public HashMap getProperties() {        //return cloned object to avoid changing it by the client application        return (HashMap) properties.clone();    }     public String getCompany() {        return company;    }	/*	 * Builder class	 */	public static class ImmutableClassBuilder{		//required fields        private int id;        private String name;         //optional fields        private HashMap properties;        private String company;                		public ImmutableClassBuilder(int id, String name) {			this.id = id;			this.name = name;		}        		public ImmutableClassBuilder setProperties(HashMap hm){			this.properties = (HashMap) hm.clone();			return this;		}				public ImmutableClassBuilder setCompany(String comp){            this.company = comp;            return this;        }		public ImmutableClass build(){            return new ImmutableClass(this);        }	}}

 

下面的测试代码为我们测试到底创建的对象是不是不可变的。

 

package cn.cd.sg.test.qita2;import java.util.HashMap;public class ImmutableClassTest {		public static void main(String[] args) {				ImmutableClass immutableClass = new ImmutableClass.ImmutableClassBuilder(1, "孙刚").build();				HashMap map = new HashMap();		map.put("age", "21");		map.put("city", "成都");				ImmutableClass immutableClass2 = new ImmutableClass.ImmutableClassBuilder(2, "孙刚").setProperties(map).build();				HashMap map2 = immutableClass2.getProperties();		map2.put("test", "test");				System.out.println(immutableClass2.getProperties());	}}

 

 

输出结果 如下:

{age=21, city=成都}

 

 

重要的知识点

  • 不可变类只有getter方法
  • 不可变类只有一个私有的构造器,以Builder对象作为参数来创建不可变对象
  • 如果不可变类的成员变量是可变的(譬如HashMap),我们需要使用深拷贝(deep copy)或者克隆来防止成员变量被更改
  • 当可选的成员变量很多的时候,使用建造者模式创建不可变类是不错的方法

 

转载地址:http://gslti.baihongyu.com/

你可能感兴趣的文章
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
laravel 修改api返回默认的异常处理
查看>>
laravel事务
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>