第15条:使可变性最小化(创建不可改变类)
来源:互联网 发布:unity3d玻璃材质下载 编辑:程序博客网 时间:2024/05/23 00:43
不可改变类是其实例对象不可改变,有人可能会想这还不简单,我们不提供改变对象
内部状态的API不就完了,没错,这是一个很重要的一条,但还有很多注意点
首先为什么要创建不可改变的类?
不可改变类比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全,在Java平台有很多不可改变类,如:String , 基本类型包装类、BigInteger BigDecimal
为使一个类不可改变,遵守下面五条规则:
1.不要提供任何会修改对象状态的方法
2.保证类不会被扩展(定义为final 类,也可以提供私有构造,然后提供静态工厂方法)
3.使所有的域都是final
4.使所有的域都是私有的
5.确保对于任何可变组件的互斥访问(如果类具有指向可变对象的域,则必需确保该类的客户端无法获得指向这些对象的引用)
然后不可变域也有不好的地方,就是第次修改都会产生一个新的对象,这将会大大影响
效率,我们可以考虑下面的情况 :
Integer sum = 0;
for(int i=0;i<100000;i++)
sum+=i;
这样下来,我们可想而知,系统里将会产生多少个Integer 对象,这将会大大影响效率,
其实Integer 在这方面已经做出来了优化,具体方案如下:
1.我们可以把经常使用到的对象提供给公有final 对象,如果BigInteger 中的ONE、TEN、zero
2.我们可以用一个静态工厂方法,将频繁使用的对象缓存起来了,这样每次我们调用的时候就可以直接返回缓存起来的值,而不用再次去创建相同的对象,下面是Integer中的做法,它是将一个字节所表示的有符号整形数据,而它的缓存则是放在了一个私有的静态内部类里面
private static class IntegerCache {private IntegerCache(){}static final Integer cache[] = new Integer[-(-128) + 127 + 1];static { for(int i = 0; i < cache.length; i++)cache[i] = new Integer(i - 128);} }下面是静态工厂方法:
public static Integer valueOf(int i) {final int offset = 128;if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset];} return new Integer(i); }
- 第15条:使可变性最小化(创建不可改变类)
- 第15条:使可变性最小化
- 第15条:使可变性最小化
- 第15条:使可变性最小化
- Effective Java 第 15 条: 使可变性最小化
- 《Effective java》读书记录-第15条-使可变性最小化
- 第15条:使可变性最小
- Effective Java 第十五条:使可变性最小化
- 第十五条:可变性最小化
- (15):使可变性最小化
- 2015070704 - EffactiveJava笔记 - 第15条 使可变性最小(1)
- 2015070705 - EffactiveJava笔记 - 第15条 使可变性最小(2)
- 使可变性最小化。
- Effective Java(使可变性最小化)
- Effective Java 读书笔记——15:使可变性最小化
- effective java(15) 之使可变性最小化
- Effective Java 类和接口 15.使可变性最小化
- 【Effective Java】Ch4_Class:Item15_使可变性最小化
- Mysql5.5.22源码编译安装
- [原创] Linux体系结构(一): Linux的前世今生
- Linux 系统cpu利用率计算
- geotools学习1--org.geotools.demo例子FirstProject
- Ruby rails 页面跳转(render和redirect_to)
- 第15条:使可变性最小化(创建不可改变类)
- linux中的ftok函数
- windows 启动函数的作用
- Java线程(二):线程同步synchronized和volatile
- 字节编码类型判断<转>
- TCP/IP层次
- Ubuntu使用指南
- 随机数生成器
- C语言关键字 - auto和register