不变性(Immutability)模式
所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,也就是保持了不变性。
一、如何让一个类具有不变性呢
将一个类所有的属性都设置成 final 的,并且只允许存在只读方法,那么这个类基本上就具备不可变性了。更严格的做法是这个类本身也是 final 的,也就是不允许继承。因为子类可以覆盖父类的方法,有可能改变不可变性,所以推荐你在实际工作中,使用这种更严格的做法。实际上在Java SDK 经常用到的 String 和 Long、Integer、Double 等基础类型的包装类都具备不可变性。通过看源码,可以发现他们的类和属性都是 final 的,所有方法均是只读的。
你或许有疑问,String类里面有很多方法是可以修改字符串的。看过底层源码的小伙伴一定知道,String的SubString() repleace()方法 都是会新创建对象的。
所有的修改操作都创建一个新的不可变对象,创建的对象太多了,太浪费内存,有没有什么办法可以解决呢?
二、利用享元模式可以减少创建对象的数量
如果你熟悉面向对象相关的设计模式,相信你一定能想到享元模式(Flyweight Pattern)。利用享元模式可以减少创建对象的数量,从而减少内存占用。Java 语言里面 Long、Integer、Short、Byte 等这些基本数据类型的包装类都用到了享元模式。
以下是Long中源码,缓存了-128-127之间的数字。
在Integer中也是一样的
原文:https://www.cnblogs.com/amberJava/p/12446010.html