Java不可变类–构建器模式
时间:2020-02-23 14:36:38 来源:igfitidea点击:
在上一篇文章中,我解释了Java中的Builder模式。
有时我写了一篇关于如何在Java中创建不可变类的文章。
在本文中,我们将学习使用Builder模式创建Java不可变类的简便性。
当构造函数中的参数数量更多而可能导致其顺序混乱时,使用构造器模式创建不可变类是一种好方法。
Java不可变类要点
不可变类应仅具有getter方法。
不可变类将具有一个带有Builder对象作为参数的私有构造函数,该私有构造函数将用于创建不可变类。
如果不可更改的类属性不是不可更改的,例如HashMap,则应执行深度复制或者克隆操作,以避免修改其属性。
当不可变类中的可选属性数量更多时,使用Builder模式很容易。
Java不可变类–构建器模式
这是使用Builder模式在Java中实现不变类的实现。
package com.theitroad.design.builder; import java.util.HashMap; public class ImmutableClass { //required fields private int id; private String name; //optional fields private HashMap<String, String> properties; private String company; public int getId() { return id; } public String getName() { return name; } public HashMap<String, String> getProperties() { //return cloned object to avoid changing it by the client application return (HashMap<String, String>) properties.clone(); } public String getCompany() { return company; } private ImmutableClass(ImmutableClassBuilder builder) { this.id = builder.id; this.name = builder.name; this.properties = builder.properties; this.company = builder.company; } //Builder class public static class ImmutableClassBuilder{ //required fields private int id; private String name; //optional fields private HashMap<String, String> properties; private String company; public ImmutableClassBuilder(int i, String nm){ this.id=i; this.name=nm; } public ImmutableClassBuilder setProperties(HashMap<String,String> hm){ this.properties = (HashMap<String, String>) hm.clone(); return this; } public ImmutableClassBuilder setCompany(String comp){ this.company = comp; return this; } public ImmutableClass build(){ return new ImmutableClass(this); } } }
这是测试程序,用于检查我们创建的对象是否不可变。
package com.theitroad.design.test; import java.util.HashMap; import com.theitroad.design.builder.ImmutableClass; public class ImmutableBuilderTest { public static void main(String[] args) { //Getting immutable class only with required parameters ImmutableClass immutableClass = new ImmutableClass.ImmutableClassBuilder(1, "hyman").build(); HashMap<String,String> hm = new HashMap<String, String>(); hm.put("Name", "hyman"); hm.put("City", "San Jose"); //Getting immutable class with optional parameters ImmutableClass immutableClass1 = new ImmutableClass.ImmutableClassBuilder(1, "hyman") .setCompany("Apple").setProperties(hm).build(); //Testing immutability HashMap<String,String> hm1 = immutableClass1.getProperties(); //lets modify the Object passed as argument or get from the Object hm1.put("test", "test"); hm.put("test", "test"); //check that immutable class properties are not changed System.out.println(immutableClass1.getProperties()); } }