(一) 考虑用静态工厂方法代替构造器

优点 : 

1 不需要每次调用静态工厂方法的都创建一个新对象;

例如 :

java 根据条件销毁定时器_子类

 

2 静态工厂方法可以返回原返回类型的任何子类型的对象;

3 提供静态工厂方法可以使得客户端(调用方)代码变得简洁;

缺点 :

1 类如果不包含公有的或者受保护的构造器,就不能被子类化;

2 无法区分静态工厂方法和其它的静态方法;

 

(二) 用私有构造器或者枚举类型强化单例属性

1 私有构造器 : 通过私有构造器可以控制该类的实例化,通过提供静态属性或者静态方法来提供该类的实例;

2 通过编写一个包含单元素的枚举也可以做到类的单例,并且比起私有构造器更加简洁和安全(反射和序列化)

例如:

java 根据条件销毁定时器_java 根据条件销毁定时器_02

 

 

(三) 通过私有构造器强化不可实例化的能力

如果编写只包含静态方法和静态属性的这样工具类,防止这样的工具类被实例化,增加唯一一个私有的构造器。

如 : Math、Arrays等

注:唯一一个私有的构造器类会使得该类不能被子类化;

 

(四) 避免创建不必要的对象

1 重用不可变对象;如String、基本类型的封装类等

例如:

String a = “zhangfeng”; // 这样形式

对提供静态工厂方法的要使用静态工厂方法 

Boolean.valueOf(true);

对于Integer和Long等不可变对象,不要放到循环里面去改变对象值,会造成创建不必要的对象

2 重用那些已知不会被修改的可变对象;

例如:比较时间与某个固定时刻的大小,该固定时刻可以被定义成一个私有的常量

 

(五)消除过期的对象引用

1 如果类自己管理内存,就需要警惕内存泄露问题;

如: 类中存在数组的属性,对数组那些非有效的引用,将它指向null;

2 内存泄漏的另外常见来源是缓存;

3 内存泄漏的第三个常见来源是监听器和其他回调;

注:2和3不理解

 

(六) 避免使用终结方法

1 终结方法通常是不可预测的,也是很危险的,一般情况下是不必要;

2 不应该依赖终结方法来更新重要的持久状态;

3 使用终结方法有一个非常严重的性能损失;

 

 对于类的对象封装的资源(文件和线程)确实需要终止。只需要提供一个显式的终止方法,并且在对象不再有用的时候再调用这个方法。

该类应该包含一个私有的域用来记录“该对象已经不再有效”,该私有域用来检查该对象是否会在被终止之后被调用,如果被调用,抛出IllegalStateException异常。

显示终止方法案例 : InputSteam、OutputStream的close方法和java.util.Timer的cancel方法

调用显示终止方法通常与try-finally结构结合起来使用,确保及时终止。

注: 若子类覆盖了父类的终结方法,在子类的终结方法就必须调用超类的终结方法。如下:

java 根据条件销毁定时器_java 根据条件销毁定时器_03