美文网首页Java学习笔记
第2章.创建和销毁对象[Effective Java 第2版]

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

作者: 简_单单 | 来源:发表于2017-06-18 19:39 被阅读14次

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结构结合使用 , 保证终止方法能被调用 .

相关文章

网友评论

    本文标题:第2章.创建和销毁对象[Effective Java 第2版]

    本文链接:https://www.haomeiwen.com/subject/ycgbqxtx.html