EffectiveJava之13-支持非可变性
来源:互联网 发布:大数据 书籍 编辑:程序博客网 时间:2024/05/21 22:39
1、 非可变类要遵循的5条规则:
a) 不要提供任何可能会修改对象的方法;
b) 保证没有可以被子类修改的方法;
c) 使所有域都为final的;
d) 使所有的域都成为私有;
e) 保证对任何的可变组件的互斥访问。(如果类中有可变对象的引用,则要保证客户无法得到这些对象的引用,并且不要用客户提供的对象来初始化这些域。
在构造函数、访问方法、readObject方法中使用保护性拷贝(defensive copy)。
2、 函数的方法,来实现非可变对象。一个非可变对象只有一个状态,就是最初被创建时刻的状态。
3、 非可变对象本质上是线程安全的
4、 有些非可变类有可变配套类,如string stringbuffer
5、 对于一个非可变类 除了在class前加final ,另一个做法就是 将类中的每一个方法都编程final,好处是:可以扩展这个类。在原来的基础上增加新的方法。
这样的效果和 “在一个独立的、不可被实例化的工具类中增加了新的静态方法”相同。所以此方法不被提倡。
6、 使一个非可变类变为final的另一个替代方法是:是构造函数私有化,并提供静态工程来替代构造函数。
7、 静态工厂的好处是 可以为同样的参数,提供不同的构造,只需要提供第二种静态工厂即可。比如:
Private complex(float x,float y){}
Public static complex valueOf(float x,float y){
Returnnew complex(x,y);}
Public static complex valueOfPolar(float x,float y){
Returnnew complex(x*cos(theta),
Y*sin(theta));}
8、 若非可变类实现了Serializable,并且他包含一个或多个指向可变对象的域,这必须要提供一个readObject或readResolve方法。
9、 不要为每一个getXX() 都设置setXX(),尽量设计成非可变的,
10、 TimerTask是可变类,但是状态空间被设计的很小,可以创建他,调度,.....
但完成或取消后,就不能再重新调度它。
- EffectiveJava之13-支持非可变性
- Java性能优化(13):支持非可变性
- 支持非可变性
- 支持非可变性
- .NET解析之可变性
- EffectiveJava
- EffectiveJava
- Effective Java之使可变性最小(十五)
- Java类型推断将不再支持可变性规范
- Java类型推断将不再支持可变性规范
- EffectiveJava之14-复合优于继承
- EffectiveJava之10-谨慎改写clone
- EffectiveJava之15、17、24、29、32
- EffectiveJava(24)使用@SuppressWarnings("unchecked")消除非受检警告
- F#程序设计-函数式编程之值的可变性
- effective java(15) 之使可变性最小化
- EffectiveJava之16-★接口优于抽象类
- EffectiveJava之18-优先考虑静态成员类
- Masonry介绍与使用实践(快速上手Autolayout)
- 第十三周项目五:字符串操作(二)
- 博客学习日记-2014/11/21
- poj1985
- DataList 增删改查、分页
- EffectiveJava之13-支持非可变性
- nexus5 android5.0 型号LRX210 ROOT
- Android View系统分析之二View与ViewGroup,androidviewgroup
- 关于iOS中的文件打散与使用FTP上传(伪断点续传大文件)
- UVa10541 - Stripe(动态规划,大整数加法)
- iOS多线程demo
- Solr调研总结
- 1023. Have Fun with Numbers (20)
- 欧拉回路