美文网首页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