- 使用static factory 方法取代构造方法(Consider static factory methods instead of constructors)
- 当构造方法参数很多时考虑使用builder (Consider a builder when faced with many constructor parameters)
- 单例模式的属性用私有的构造方法或者是一个enum 类型初始化(Enforce the singleton property with a privagte constructor or an enum type)
- 不能实例化的类要创建一个私有的构造方法(Enforce noninstantiability with a private constructor)
- 选择依赖注入而非硬链接资源(Prefer dependency injection to hardwiring resources)
- 避免创建无用的对象(Avoid creating unnescessary objects)
① 避免调用构造方法创建对象,使用静态工厂方法 (如 Boolean.valueOf(String), 而不用 Boolean(String))。
String s = new String("bilibili"); // 不可取
String s = "bilibili"; //应该这样写
②cache开销大的对象。
③类似Map.keySet这种方法,每调用一次就会产生一个Set对象,所以对于一个Map对象没有必要调用多次keySet.
④自动装箱。尽量使用基本数据类型,而非包装类型。
- 减少过时对象引用
① 当一个元素被释放掉之后,任何该元素包含的引用对象都应该被置为null。比如pop之后,将栈该地址置为null。
② cache 的对象当变得不相关之后 很容易被遗忘,没有清理掉
③ 监听和回调。比如一个API注册了回调但是并没有取消回调,会导致内存一致占用,一种解决方法是将callback存为WeakHashMap的key。
- 避免finalizers 和 cleaners
① finalizers 无法预测,通常很危险,一般情况下没必要存在。
② Java9中用cleaners替代了finalizers,因为cleaners比finalizers危险性低,但是仍然无法预测,性能低,也没有必要存在。
- 使用try-with-resources 而非 try-finally