1、用静态工厂方法代替构造器
优点:有自己的方法名,见名知其意;不用重复创建对象,类似单利模式中的饿汉式。
缺点:公有静态方法返回的非公有类不能被实例化;查找API麻烦。
2、遇到多个构造器参数时要考虑使用构建器
参数很多时,使用构建器模式便于阅读。
3、用私有构造器或者枚举类型强化Singleton属性
单例是线程安全的。
4、通过私有构造器强化不可实例化的能力
有的工具类进行实例化无意义,将其构造方法私有化。
5、优先考虑依赖注入来引用资源
6、避免创建不必要的对象
String str = "hello"; jdk7后,str字符串的创建是在堆内存。
7、消除过期的对象引用
过期引用会造成内存泄漏?
解决方法:将不再使用的元素置为null。
8、避免使用终结方法和清除方法
FileInputStream源码中实现了终结方法,优点在于如果忘记close()方法,会执行终结方法。
9、覆盖equals时请遵守通用约定
覆盖equals方法时,遵守约定:自反性,对称性,传递性,一致性,对于任何非null的引用值x,x.equals(null)必须返回false。
instanceof是类型比较,例如 A instanceof B 指的是A是否是B类型的。
10、覆盖equals时总要覆盖hashCode
两个对象使用equals返回true,则他们的hashCode也一定相等,反之,如果两个对象的hashCode相等,但他们的equals不一定相等。
11、始终要覆盖toString
在实际应用中,toString方法应该返回对象中包含的所有值得关注的信息。
12、谨慎地覆盖clone
13、考虑实现Comparable接口
Comparable接口只有一个方法:comparaTo
int x = a.comparaTo(b);
a>b,则x>0;
a=b,则x=0;
a<b,则x<0;
14、使类和成员的可访问性最小化
15、要在公有类而非公有域中使用访问方法
类的封装:属性私有化,提供getter/serter方法。
16、使可变性最小化
final:修饰类时,不能被继承;修饰成员变量时,是常量。
17、复合优先于继承
18、要么设计继承并提供文档说明,就用final修饰,禁止子类化
谨慎使用继承:若使用了,要注释写出重写这个方法会给其他方法带来什么影响;
若类不是为继承而生,就用final修饰,禁止子类化。
19、接口优于抽象类
因为java只支持单继承,但可以实现多个接口。
20、接口只用于定义类型
接口不要只用于定义常量,不然还不如使用枚举类或不可实例化的工具类。