EffectiveJava笔记

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()
    
总结:不读这本树同样可以写出程序,但是读这本书可以让java开发有更好更实用的开发技巧,书不讲基础知识,因此不适合初学者,相反,写代码的时间越长读这本树感悟越多,而且,随着工作经验越长,对书的内容理解越深,适合长期收藏的书。

你可能感兴趣的:(EffectiveJava笔记)