一:考虑使用静态工厂方法替代构造函数
好处有:
1.我们可以定义静态函数的名字,相对于只能使用类名作为构造函数名,可以使用函数名更加详细的说明该静态函数的功能。
2.是一些设计模式的基础——单例模式,工厂模式等等
3.可以简化参数化的构造函数,使代码简介
缺点:
1.一般使用静态工厂方法来创建类对象,会把该类的构造函数设置为private,这样使得类不能被子类化(但是一般都不鼓励使用继承)。
2.使用静态工厂方法来创建类对象的静态函数与其他静态函数并无区别,因此在API文档中没有明显的标识。
二:当构造函数包含多个参数时,使用builder模式
三:使用私有构造函数或枚举来实现单例模式
四:消除过期的对象引用
虽然java有gc机制,但是还是存在内存泄漏(简单来说就是一个类的对象已不会再使用了,但是该类所占的内存不能被回收)。一般情况都是发生在数组、List或其他类似的集合中。避免这样的情况是记得顺手把不需要类对象的引用设置为null,或者在某些情况下(缓存)使用WeakHashMap
五:避免使用finalizer方法
原因是当一个类变为不可达的时候(也就是满足被gc回收的条件)到他被回收并且调用finalizer方法之间的时间是不确定的。因此,一些注重时间的任务不应该使用finalizer方法,例如使用finalizer来关闭已打开的文件。此外效率也低,一般使用finalizer方法主要有2种情况:
1.作为第二道防线,有些时候延迟关闭文件总比不关闭文件好吧
2.关闭一些非关键的本地资源,有些本地资源并不能被gc回收,这个时候就需要在finalizer收到关闭这些资源。
六:关于equals方法
当覆盖equals方法的时候,必须也要覆盖hashCode方法。如果不这样,当你使用HashedMap的时候产生bug时候就知道了为什么了。
记住是覆盖equals方法,而不是重写,因此参数必须为Object 而不是具体的类,习惯家个@Override吧
七:谨慎使用克隆
记住java的clone是浅复制,如果被克隆的类中包含引用,那么克隆的类是和被克隆的引用指向同一个对象。我们不得不用更复杂的逻辑来完成深度克隆。
八:使类的可访问性最小
这个是面向对象编程特点之一——封装。
这里有2点值得注意的,1.如果我们要测试一个private的函数,把private改为包级私有还是可以的。2.对于一个final数组的,应设置为private,然后当要获得这个数组的时候,应该使用public方法返回一个final的List或者是该数组的克隆
九:接口只用于定义类型
常量接口(接口中定义了一些静态常量)的使用是有问题的。
十:类层次由于标签
所谓的标签就是在该类中,可能存在一个变量,可能该类中的大多数函数方法会根据该类的不同而做不同的处理,这个使用就应该把这些标签拆分成不同的类,然后继承于公一个抽象类。把公用的方法放入抽象类,不同的方法写入不同的类中。