`
schumee
  • 浏览: 24592 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Effective Java 学习笔记第13条 --- 支持非可变性

阅读更多

为了使一个类成为非可变类,要遵循下面五条规则:

  1. 不要提供任何会修改对像的方法;
  2. 保证没有可被子类改写的方法;
  3. 使所有的域都是final的;
  4. 使所有的域都成为私有的;
  5. 保证对于任何可变组件的互斥访问。(如果一个类指向可变对象的域,则必须确保该类的客 户无法活得指向这些对象的引用,并且永远不要用客户提供的对象引用来初始化这样的域,也不要在任何一个访问方法中返回该对象的引用);

以上规则比真正的要求强了一点,为了提高性能可以有所方式,如:保证没有一个方法能够对对象的状态产生外部可见的改变,许多非可变的类拥有一个或者多个非final的冗余域,把一个开销昂贵的计算结果缓存在这些域中。非可变对象本质上是线程安全的,它们不要求同步。非可变对象可以被自由地共享。你不仅可以共享非可变对象,甚至也可以共享它们的内部信息。非可变对象为其他对象--无论是可变的还是不可变的--提供了大量的构件。非可变类真正唯一的缺点是,对于每一个不同的值都要求一个单独的对象。String就是这样的。通常有个解决的办法就是提供一个帮助类来弥补,例如StringBuffer类。


如果一个类不能被做成非可变类,那么你仍然应该尽可能地限制它的可变性。
构造函数应该创建完全初始话的对象,所有的约束关系应该在这时候建立起来,构造函数不应该吧“只构造看一部分的实例”传递给其他的方法,不应该在后者函数之外子踢狗一个公有的初始化方法。

 

使一个类成为非可变类有如下三种方法:

  1. 将一个类声明为final类型的;
  2. 让该类中的每一个方法都成为final的,这种方法的好处在于其子类可以继续扩展新的方法;
  3. 把类的构造函数声明为私有的或者包级私有的,增加静态工厂方法,来代替公有的构造函数;(该方法虽然不常用,但却是最值得推荐的)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ilibaba/archive/2009/01/20/3839519.aspx

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics