Effective Java 2th Part I
Effective Java 2th Part I
创建与销毁对象
1、静态工厂代替构造器
优点:
- 命名:方法名称表示对象含义
- 复用:不需要每次都创建新对象
- 返回子类对象:可以返回该类的子类对象
- 创建参数化类型对象简洁:new HashMap
>().
缺点: - 没有默认或保护的构造方法无法子类化
- 只是一个静态方法而不像构造函数有明确的语法含义
2、多个构造参数考虑使用构造器
|
|
优点:
- 灵活
- 具名
- 安全
缺点: - 需要创建构造器,性能开销
3、私有构造器强化单例属性
- 见单例模式
- 唯一元素的枚举类也是一种单例的最好方法
4、私有构造函数使得某些类不可实例化(工具类等)
5、不要创建多余的对象
- 避免频繁使用装箱基本类型1234Long s=0L;for(long i=0;i<100000;i++){s+=i;//warning!每次都创建一个Long对象}
6、消除过期的对象引用
- 如果类自己管理内存,注意内存泄漏,比如自己实现的堆栈
- 缓存要注意清理问题
- 监听器与回调
7、避免使用终结方法
对于所有对象都通用的方法
8、覆盖equals方法注意:
- 自反性、对称性、传递性、一致性、非空性(x.equals(null)==false)
- 使用instanceof检查参数是否为正确类型
- 注意方法的入参类型是Object,否则是重载
- ==比较不是float与double的基本类型,引用使用equals,float使用Float.compare(),double使用Double.compare()
9、覆盖equals时候始终覆盖hashcode
- 否则影响hash
10、始终覆盖toString()
11、谨慎实现cloneable接口
- 一般不要实现,否则需要提供良好的实现,深度拷贝与同步
12、考虑实现comparable接口
- 获得更多的内置集合功能,如排序等
类和接口
13、使类和成员的可访问性最小化
- 封装
14、访问属性使用访问方法而不是直接访问
- 私有的嵌套类可以直接访问,危害性较小
15、尽量使用不可变性
- 线程安全,内部信息共享,提供大量构件
16、使用复合而不是继承
- 复合和转发机制(装饰器模式)
- 只有在is-a关系时使用继承
17、要么为继承而设计,要么禁止继承
- 需要提供详细的文档说明
- 好的API文档描述一个操作做了什么,而不是如何做的
- 如果允许继承,构造器不可以调用可覆盖的方法
18、接口优于抽象类
- 接口利于实现混合类型(某个类具有某种特定的功能,如Comparable接口)
- 利于实现非层次的类结构,比如歌唱家与作家接口
- 一般导出接口的骨架实现抽象类或简单实现(用于直接使用或继承)
- 抽象类对比接口更容易演变
- 公开接口一旦发布,几乎无法修改,建议同时发布骨架抽象类
19、接口只用于定义类型
- 导出常量使用枚举,而不是包含一堆static final变量
20、类层次优于标签类
- 不要在一个类中完成相似而又不同的多套逻辑(三角形与原形面积计算,一个类中使用switch类的逻辑判断)
- 针对相似而不同的逻辑关系,考虑拆成子类父类的类层次关系
21、用函数对象标识策略
- 策略模式
22、优先考虑静态成员类
- 非静态的嵌套类每个实例都会持有一个外围类的引用
- 如果嵌套类不需要外围实例的引用,就使用静态,否则使用非静态