1.考虑用静态工厂方法代替构造函数(Integer.valueOf(),Boolean.valueOf())
1.静态方法有方法名进行分辨
2.静态方法不一定非要新建一个对象,new 方法肯定会新建对象
3.可以返回子类对象(?)
1b.
2b.与其他静态方法没有区别
2.私有构造函数强化单例
3.私有构造函数防止被实例化或子类实例化
4.避免创建重复对象:如String s=new String("Hello world");//不推荐
5.消除过期的引用对象:手动ref=null以释放资源,适用于数组
6.避免使用终结函数finalize(),java自动垃圾回收比人为回收资源稳定
/////对象
7.重写equals()时遵守标准
8.重写equals()时顺便把hashCode()也重重写了
9.建议重写toString()
10.谨慎重写clone():复杂度太高了,尽可能不重写而是提供其他拷贝方法
11.实现Compareable接口:值类都应该这样,方便排序什么的,compareTo()不用判断时参是否为null
///////类和接口
12.使类和成员的可访问能力最最小话:private default protected public
13.支持不可变性
14.复合优先于继承:与其实现父类的方法,不如将父类型作为子类的一个属性进行转发操作
这样可以防止父类接口方法的变动影响子类,也叫“包装类”,不能用在回调框架上,
最好不要支持链式编程
15.要么专门为继承而设计,并给出详细的文档说明,要么禁止继承:
继承为了方便实现,可考虑钩子函数的使用
子类构造函数不能调用可重载(override)的函数
clone()和readObject也不能调用可重载的任何方法,他们跟构造函数差不多
如果必须继承,确保没有自调用方法
16.接口由于抽象类:java单继承机制使抽象类不好用
接口方便子类的功能扩展
可以考虑一个接口骨架子类实现大部分相关操作如:AbstractXXX.class
17.接口仅限于定义类型:
为了常量而实现一个接口不明智,反而是污染
18.优先考虑静态成员类:
静态内部类占用更少的内存(内部类不访问外部类属性的情况下)
///////C语言替代
19.用类代替结构
///////方法
23.检查参数的有效性
24.必要时使用保护性拷贝
25.谨慎设计方法的原型:接口方法明具备一定的相似
参数一般3个左右即可
用类携带参数,以减少参数数量
尽量使用接口作为参数,而不是实现类
26.谨慎重载方法:overload不是override(覆盖)
避免参数数目相同的重载方法
27.返回零长度的数组而不是null
28.为所有导出的公开API写注释文档
//////////第7章:通用程序设计
29.将局部变量的作用域最小化
30.了解和使用库
31.如果要求高精度的答案,避免使用float和doubel:BigDecimal更精确
32.如果有其他类型适合,尽量避免String:
值类型就用值类型
字符串不适合代替枚举
33.了解字符串连接的性能:String是值不变类,值永远不变,StringBuilder,StringBuffer
34.通过接口引用对象:参考25,顶层父类代替子类作为引用对象
35.接口比反射优先:反射会丢失编译检查的好处,反射性能普遍较低
36.谨慎使用本地方法JNI:JVM(JDK1.3之后)发展到现在,性能已经可以匹敌本地其他语言方法了
37.谨慎优化:一句话,不要优化,尤其是不成熟的优化
努力编写好的程序而不是快的程序
努力避免那些限制性能的设计决定,API,数据格式等
优化后记得测试性能
38.遵守普遍接受的命名规范
////////第8章:异常
39.只针对不正常的条件使用异常:随便使用异常只会牺牲性能
状态测试如hasNext()比较好
尽量不强迫API使用者使用异常
40.对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常
41.尽量不要抛出多余的异常:麻烦
如果异常较少的话还不如不抛,可以考虑转换成boolean
42.尽量使用标准异常
43.抛出的异常要合适于相应的抽象
异常捕获与转换
44.每个抛出的异常都要有文档
45.在细节中包含失败,捕获信息
46.努力使失败保持原子型
尽量检查参数的有效性
在拷贝上操作,完成再复制
47.不要忽略异常
///////////第9章:线程
//////////第10章:序列化
54.谨慎使用Serializable
序列化开销很大
为了继承而设计的类应尽量不要实现序列化接口:抽象类不能实例化等因素
55.尽可能自己设计序列化形势
如果不确定是否需要使用默认的序列化形势,则不要使用默认序列化
如果一个对象的物理表示等同于它的逻辑内容,可以考虑默认序列化形式
默认序列化尽量提供readObject()实现约束
56.保护性的实现readObject()
57.必要时提供一个readResolve()