Effective Java 读书笔记之2 创建和销毁对象

博文来源于

Effective Java 读书笔记之2 创建和销毁对象

csdn:linyh1992

第1条:考虑用静态工厂方法代替构造器

和构造方法先比,静态工厂方法的优缺点

优点:

  • 静态工厂方法具有名称,更加清晰易懂

  • 不必每次都通过new创建一个对象

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE);
}
  • 可以返回子类对象

  • 降低冗长的泛型定义(由于是定义一些容器类的时候)

    public static final <T> ArrayList<T> newArrayList(int initialCapacity){
        return new ArrayList<T>(initialCapacity);
    }

缺点:

  • 如果提供静态工厂方法,应该禁止提供构造方法,而且类不能够被继承

  • 和其他静态方法没区别

第2条:遇到多个构造器参数时要考虑用构建器

如果构造方法参数复杂的话,应该使用Builder模式,比如在创建类的时候,需要初始化很多相关的类

第3条:用私有构造器或者枚举类型强化Singleton属性

尽量使用Enum来创建单例或者构造方法应该使用private修饰

对于通过反射机制,调用私有的构造方法,可以通过修改构造方法,在要求创建第二个实例的时候抛出异常

此外,为了防止反序列化,创建类对象,应该使用transient修饰单例对象

// 引申话题1,单例创建的方式有多少种?

第4条:通过私有构造器强化不可实例化的能力

对于一些不希望被实例化的类,比如只提供静态方法和静态域的工具类,应该讲类声明为final类型,而且显示声明构造方法是private的,并且在构造方法中抛出异常(比如AssertionError),禁止通过反射的方式调用私有的构造方法

// final 修饰类,不允许继承,private修饰构造方法,不允许创建

final class Utils {

    private Utils() {
        throw new AssertionError();
    }

    public static <T> T checkNotNull(T value, String message) {
        if (value == null) {
          throw new NullPointerException(message);
        }
        return value;
    }
} 

第5条:避免创建不必要的对象

  • 重用不可变的对象(比如基本类型的包装类,最好不要通过new来创建)

    String str = new String("abc"); //不建议
    String str = "abc"; //建议
  • 重用已知不会被修改的可变对象

  • 优先使用基本类型而不是自动装箱类型,当心无意识使用自动装箱
    // 引申话题2,关于自动装箱和拆箱

第6条:消除过期的对象引用

  • 自己管理内存的类,应该警惕内存泄露问题,一单元素被释放,则钙元素中包含的任何对象引用都应该被清空

  • 缓存,应该使用WeakHashMap或者弱引用来管理缓存;对于生命周期不确定的缓存项,可以通过后台启动线程来回收。

  • 监听回调,如果对象注册了监听,那么在这个对象生命结束前取消回调;或者对监听回调使用弱引用

第7条:避免使用终结方法

Object对象中的finalize方法是不可靠的,调用的时间是由jvm的决定的,而且也有可能不会被调用。

重写finalize影响性能

可通过try-catch-finally显式回收对象

深入理解java的finalize
JAVA面试题解惑系列(四)——final、finally和finalize的区别
自动装箱拆箱原理分析
单例模式的八种写法比较

你可能感兴趣的:(Effective Java 读书笔记之2 创建和销毁对象)