Java语言不可变类的诀窍
示例
不可变对象是状态无法更改的对象。不可变类是其实例根据设计和实现是不可变的类。作为不可变性示例最常见的Java类是java.lang.String。
以下是陈规定型的示例:
public final class Person { private final String name; private final String ssn; //(SSN==社会安全号码) public Person(String name, String ssn) { this.name= name; this.ssn= ssn; } public String getName() { return name; } public String getSSN() { return ssn; } }
对此的一种变体是将构造函数声明为,private并提供一个publicstatic工厂方法。
不变类的 标准配方如下:
所有属性必须在constructor(s)或工厂中设置method(s)。
应该没有二传手。
如果出于接口兼容性的原因而必须包含setter,则它们应该什么都不做或抛出异常。
所有属性都应声明为private和final。
对于引用可变类型的所有属性:
该属性应使用通过构造函数传递的值的深层副本进行初始化,并且
属性的getter应该返回属性值的深层副本。
应该声明该类,final以防止有人创建不可变类的可变子类。
还有两点需要注意:
不变性不会阻止对象为空。例如null可以分配给String变量。
如果将不可变的类属性声明为final,则实例本质上是线程安全的。这使不可变类成为实现多线程应用程序的良好构建块。