对象的创建与销毁
1.用静态工厂方法代替构造器,类似go语言的func New(...)
public static Date from(Instant instant) { try { return new Date(instant.toEpochMilli()); } catch (ArithmeticException ex) { throw new IllegalArgumentException(ex); } }
2.遇到多个构造器参数时要考虑使用建造者模式
3.单例模式使用枚举
4.如果类不需要被实例化使用私有构造器
5.优先使用依赖注入来引入资源
6.避免创建不必要的对象,优先使用基本数据类型而非包装类型
7.消除过期对象的引用,当使用数组时注意元素移除需要将索引位置为null
8.避免使用终结方法和清除方法
9.try-with-resources由于try-finally
通用方法
10.覆盖equals方法遵守约定
11.同时覆盖hashcode方法
12.始终要覆盖toString方法
13.谨慎的覆盖clone
14.考虑实现comparable接口
将这个对象与指定的对象进行比较。当该对象小于、等于或大于指定对象的时候,分别返回一个负整数、零或者正整数
类和接口
15.类和成员的访问性最小化
16.在公有类而非公有域中使用访问方法(公有域即public的成员变量,可以在其他类中访问)
17.使可变性最小化
18.复合优先于继承(先实现需要实现的方法,再被子类继承提供能力)
19.要么使用继承提供文档说明要么禁用继承
20.接口优于抽象类
21.为后代设计接口,jdk8中的default方法
22.接口只用于定义类型,不应该被用来导出常量
23.层次优于标签类(每个子类中针对根类中每个抽象方法的相应实现)
反例:
double area() { switch(shape) { case RECTANGLE: return length * width; case CIRCLE: return Math.PI * (radius * radius); default: throw new AssertionError(shape); } }
24.静态成员类优于非静态成员类, 如果声明成员类不要求访问外围实例,应该静态成员类
25.限制源文件为单个顶级类
泛型
26.不要使用原生态类型
27.消除非受检警告
28.List优于数组,泛型数组是不被允许的
29.优先考虑泛型,定义类时指定泛型类型,然后将响应的类型参数替换为类型泛型,而不是使用Object[]
public class Stack<E> { private E[] elements;...}
30.利用有限通配符提升API灵活性,? extends E, ? super E
31.谨慎混用可变参数和泛型
---------------------------------------------------------------------------------------------------------------------------------
32.优先考虑类型安全的异构容器?