第2章.创建和销毁对象[Effective Java 第2版]

来源:互联网 发布:中国产业安全数据 编辑:程序博客网 时间:2024/06/11 17:21

1. 考虑用静态工厂方法代替构造器

优点 :

  • 有名称
  • 有时不必每次都创建一个新的实例
public static Boolean valueOf(boolean b){        return b ? Boolean.TRUE : Boolean.FALSE ;}
  • 可返回所有返回类型的子类(静态工厂方法返回类型为接口时 , 可以返回任意实现此接口的类)
  • 使得创建实例的方法显得更加简洁
public static <K,V> Map<K,V> newInstance(){    return new HashMap<K,V>();}Map<String,List<String>> m = HashMap.newInstance();

缺点 :

  • 类如果不含有公有的或者受保护的构造器 , 就不能被子类化 (什么意思 , 没有看懂 (ㄒoㄒ))
  • 静态工厂方法和静态方法本质是一样的 . 不容易被发现并使用静态工厂方法来实例化 .

2. 考虑用构建器 ( Builder ) 来代替多参数的构造器

  • 重载构造器不方便实例化
  • 利用 Builder 方便添加约束条件 ( 在 build 方法的时候抛出 )
  • 可以通过一个 Builder 来实例化多个目标对象

3. 使用枚举来实现单例

  • 即使进行复杂的序列化和反射也无法多次实例化 ( 保证单例的唯一性 )
public enum Jared{        INSTANCE;        public void method(){ ... }}

4. 使用私有构造器使类不能被实例化

public class UtilityClass{        private UtilityClass(){        }}

5. 避免创建不必要的对象

  • 重用不可变对象
String s = new String("stringette");//创建了多余的String实例String s = "stringette";//使用此方法复制 , 而非上面的 . 
  • 避免无意识的自动装箱 ( 优先使用基本类型 )
public static void main(String[] args){        Long sum = 0L;//此处使用 Long 声明 sum  , 后续处理会自动装箱 , 应该使用 long 声明 .        for ( long i = i ; i < Integer.MAX_VALUE ; i ++ ) {                sum += i ;        }        System.out.println(sum);}

6. 清除过期的对象引用

7. 避免使用 finalize 方法

  • 使用显式的方法终止对象中的资源 , 如 : InputStream中的close方法
  • 显式终止方法与try-finally结构结合使用 , 保证终止方法能被调用 .
原创粉丝点击