第二章创建和销毁对象

2020-03-11  本文已影响0人  后来丶_a24d

目录


创建和销毁对象

静态工厂方法(就是类里面的static方法创建对象)代替构造器

优点:

  1. 静态工厂方法有名字;
  2. 不必要每次调用的时候都创建一个新的对象。
  3. 返回原返回类型的任何子类型对象。
  4. 创建参数化类型实例的时候使代码变得更加简洁。

遇到多个构造器参数时要考虑使用构造器

Builder 模式,代码易读,模拟了具名的可选参数,build 方法可检验约束条件。 builder 可以自动填充某些域,比如每次创建对象的时自动增加序列号。

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

public class Elvis {
    public static final Elvis INSTANCE = new Elvis();
    //私有化
    private Elvis() { … }
    public void leaveTheBuilding() {…}
}

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

希望一个类不能被实例化,则私有化构造方法,比如一个很多都是static方法的类,肯定不希望被实例化

避免创建不必要的对象

String s1 = "string";

String s2 = new String("string");  // don‘t do this

清除过期的对象引用

Java 内存泄露可能发生在:

public class Stack {
        private Object[] elements;
        private int size = 0;
        private static final int DEFAULT_INITIAL_CAPACITY = 16;
        public Stack() {
            elements = new Object[DEFAULT_INITIAL_CAPACITY];
        }
        public void push(Object e) {
            ensureCapacity();
            elements[size++] = e;
        }
        public Object pop() {
            if (size == 0) 
                throw new EmptyStackException();
            return elements[--size];
        }
        private void ensureCapacity() {
            if (elements.length == size)
                elements = Arrays.copys(elements,2*size+1);
        }
    }

改进
public Object pop() {
        if (size == 0) 
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null; //手工将数组中的该对象置空
        return result;
    }

避免使用终结方法

使用依赖注入取代硬连接资源

public class SpellChecker {
    private static final Lexicon dictionary = ...;

    private SpellChecker() {} // Noninstantiable

    public static boolean isValid(String word) { ... }
    public static List<String> suggestions(String typo) { ... }
}
public class SpellChecker {
    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = Objects.requireNonNull(dictionary);
    }

    public boolean isValid(String word) { ... }
    public List<String> suggestions(String typo) { ... }
}

在处理必须关闭的资源时,使用 try-with-resources 语句替代 try-finally 语句。 这会使生成的代码更简洁、更清晰,并且抛出的异常在调试时更有用。


参考文献

上一篇 下一篇

猜你喜欢

热点阅读