这是 Joshua Bloch 的书 Effective Java 第 2 章的简短摘要。我只包含了与我自己相关的项目。
静态工厂与构造函数的一些优点:
仅 使用静态工厂(例如使用私有构造函数)的主要缺点是该类不能被子类化。
调用带有许多参数的构造函数可能很麻烦,因为它需要查看方法声明以了解参数代表什么。这使得读取和调用这样的构造函数变得困难。
一种替代方法 是使用无参数构造函数构造一个对象,然后使用 setter 来设置所需的字段(JavaBean 模式)。这种方法的缺点是在设置不变量时对象可能处于不一致状态。此外,由于您提供的是 setter,因此对象是不可变的,这使得线程安全变得困难。
建筑商是两全其美的第二种选择。构建器首先以可读和紧凑的方式“收集”参数,然后通过首先验证不变量是否正确来实例化对象。
由于构建器对于小类来说可能有点矫枉过正,因此本书建议将其用于具有四个以上参数的类。请注意,构建器是构造函数和静态工厂的替代方案。
创建对象时应小心。重用昂贵的对象,但不要以防御性复制为代价(为了不可变性——第 39 条)。基元应优先于装箱基元,并在执行自动装箱时注意删除不必要的对象创建。
这些书展示了一个堆栈示例,其中弹出项未从内部数组中清空,使它们成为无法被垃圾收集的过时引用。内存泄漏和过时引用的常见来源:
WeakHashMap
用于仅在存在对条目的外部引用时才保存项目的缓存。WeakHashMap
。标签2: Java教程地址:https://www.cundage.com/article/jcg-effective-java-creating-destroying-objects.html