这篇文章中,我们将看到如何使用建造者模式创建不可变类。当构造器中的参数很多时,并且参数的顺序会给人造成困扰的时候,那么使用建造者模式来创建不可变类就是非常好的方法了。
使用建造者模式来创建不可变类
下面是使用建造者模式来创建不可变类的例子:
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)或者克隆来防止成员变量被更改
- 当可选的成员变量很多的时候,使用建造者模式创建不可变类是不错的方法