Immutable Pattern

什么是Immutable Pattern?

举个例子,java.lang.String这个类没有提供任何改变字符串属性的方法,也就是说,String实例所代表的字符串属性不会改变。因此,String的方法都不需要synchronized。

可以将一个类声明为final,保证不允许别人定义它的子类,可以将它的字段设置为private,只能在内部看到。

Immutable Pattern

都没有什么能改变它,他当然能被多个线程*访问。


什么时候使用Immutable Pattern?

1、当实例产生后,状态不再变化

2、实例需要共享,而且访问很频繁。当使用immutable pattern的时候,最大的优点就是线程安全而且效率高,有时候,省下synchronized可以增加很大的效率。


成对的mutable类和immutable类

将同一个类的设计分为可变和不可变的,可变的类内部使用synchronized方法保证线程安全,不可变的类保证程序运行速度。

JDK中就存在这样的类,像是java.lang.String和java.lang.StringBuffer。String不可变速度快,StringBuffer可变,然而内部使用了synchronized方法保证了线程安全。同时StringBuffer里存在一个String作为参数的构造器,而String里也有StringBuffer作为参数的构造器。

对于基本数据类型也存在这样的成对关系,将首字母大写即可(包装类)。里面有一个特例,void与java.lang.Void,后者无法建立实例,这个类作用只是用来保存基本类型void的Class对象的实例,使用在反射和序列化等机制上。


final关键字

final类:使类无法被继承,该类方法也不会被覆盖

final方法:这个方法如果是实例无法被子类覆盖,如果是类方法,无法被子类隐藏(对于父类的类方法,方法无法被覆盖,只是被隐藏了)

final字段的值只能指定一次,第一种是在声明是就赋值,另一种则是在构造器中赋值。