《Effective Java》笔记

来源:互联网 发布:金融行业前景知乎 编辑:程序博客网 时间:2024/05/18 02:46

创建和销毁对象:
1.考虑用静态工厂方法代替构造器。
优势:

有名称。如果构造器的参数本身没有确切的描述正被返回的对象,那么就有适当名称的静态工厂会更容易使用。一个类只能有一个带有指定签名的构造器(一种避开限制的方法是更改参数列表的顺序)。当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并且慎重选择名称突出区别。不必在每次调用时新建一个对象。如果程序经常请求创建相同的对象,并且代价很高,这项技术可以极大提高性能。可以返回原返回类型的任何子类型的对象。API可以返回对象,同时又不会使对象的类变成公有的。这项技术适用于基于接口的框架。在创建参数化类型实例的时候使代码变得更加简洁。Map<String,List<Stirng>> m = new HashMap<String,List<Stirng>>();随着参数变得越来越长,这一冗长的说明变得痛苦。用静态工厂方法,编译器可以替我们找到类型参数,这被称为类型推导。假设HashMap提供这个静态方法:public static <K,V> HashMap<K,V> newInstance(){  return new HashMap<K,V>(); } 就可以用以下代码代替上述代码:Map<String,List<String>> m = HashMap.newInstance(); 缺点:类如果不含公有的或者受保护的构造器,就不能被子类化。与其他的静态方法实际上没有任何区别.静态工厂方法惯用名称:valueOf,of,getInstance,newInstance,getType,newType.

2.遇到多个构造器参数时要考虑使用构建器
3.用私有构造器或者枚举类型强化Singleton属性
4.通过私有构造器强化不可实例化的能力
5.避免创建不必要对象
6.消除过期的对象引用
7.避免使用终结方法

对于所有对象都通用的方法:
8.覆盖equals是请遵守通用约定

equals方法实现了等价关系即(自反,对称,传递,一致性)对于任何非null的引用值x,x.equals(null)必须返回false。

实现高质量equals方法:

使用==操作符检查“参数是否为这个对象的引用”使用instanceof操作符检查“参数是否为正确的类型”把参数转换成正确的类型对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域匹配当编写完equals方法时考虑是否满足等价关系

9.覆盖equals时总要覆盖hascode
10.始终要覆盖tostring
11.谨慎的覆盖clone

类和接口:
12.考虑实现comparable接口
13.使类和成员的可访问性最小化
14.在公有类中使用访问方法而非公有域
15.使可变性最小化
16.复合优先于继承
17.要么为继承而设计,并提供文档说明,要么就禁止继承
18.接口优先于抽象类
19.接口只用于定义类型
20.类层次优先于标签类
21.用函数对象表示策略
22.优先考虑静态成员类

泛型:
23.请不要在新代码中使用原生态类型
24.消除非受检警告
25.列表优先于数组
26.优先考虑泛型
27.优先考虑泛型方法
28.利用有限制通配符来提升API灵活性
29.优先考虑类型安全的异构容器

枚举和注解:
30.用enum代替int常量
31.用实例域代替序数
32.用enumset代替位域
33.用enummap代替序数索引
34.用接口模拟可伸缩的枚举
35.注解优先于命名模式
36.坚持使用override注解
37.用标记接口定义类型

方法:
38.检查参数的有效性
39.必要时进行保护性拷贝
40.谨慎设计方法签名
41.慎用重载
42.慎用可变参数
43.返回0长度的数组或者集合,而不是null
44.为所有导出的API元素编写文档注释

通用程序设计:
45.将局部变量的作用域最小化
46.foreach循环优先于传统for循环
47.了解和使用类库
48.如果需要精确的答案,避免使用float和double
49.基本类型优先于装箱基本类型
50.如果其他类型更适合,避免使用字符串
51.当心字符串连接的性能
52.通过接口引用对象
53.接口优先于反射机制
54.谨慎的使用本地方法
55.谨慎的进行优化
56.遵守普遍接受的命名惯例

异常:
57.只针对异常的情况才使用异常
58.对可恢复的情况使用受检异常,对编程错误使用运行时错误
59.避免不必要的使用受检的异常
60.优先使用标准的异常
61.抛出与抽象相对应的异常
62.每个方法抛出的异常都要有文档
63.在细节消息中包含能捕获失败的信息
64.努力使失败保持原子性
65.不要忽略异常

并发:
66.同步访问共享的可变数据
67.避免过度同步
68.executor和task优先于线程
69.并发工具优先于wait和notify
70.线程安全性的文档化
71.慎用延迟初始化
72.不要依赖于线程调度器
73.避免使用线程组

序列化:
74.谨慎的实现serializable接口
75.考虑使用自定义的序列化形式
76.保护性的编写readobject方法
77.对于实例控制,枚举类型优先于readresolve
78.考虑用序列化代理代替序列化实例