Effective Java – 创建和销毁对象

位置:首页>文章>详情   分类:Java教程   阅读(110)   2023-12-05 16:34:57

创建和销毁对象(第 2 章)

这是 Joshua Bloch 的书 Effective Java 第 2 章的简短摘要。我只包含了与我自己相关的项目。

静态工厂(第 1 项)

静态工厂与构造函数的一些优点:

  • 工厂方法的名称为构造函数添加了描述
  • 他们可以返回预先构建的对象,而不是总是返回新的。
  • 它们可以返回已声明返回类型的任何子类型,甚至是非公共类。

使用静态工厂(例如使用私有构造函数)的主要缺点是该类不能被子类化。

构建器而不是具有许多参数的构造器(第 2 项)

调用带有许多参数的构造函数可能很麻烦,因为它需要查看方法声明以了解参数代表什么。这使得读取和调用这样的构造函数变得困难。

一种替代方法 是使用无参数构造函数构造一个对象,然后使用 setter 来设置所需的字段(JavaBean 模式)。这种方法的缺点是在设置不变量时对象可能处于不一致状态。此外,由于您提供的是 setter,因此对象是不可变的,这使得线程安全变得困难。

建筑商是两全其美的第二种选择。构建器首先以可读和紧凑的方式“收集”参数,然后通过首先验证不变量是否正确来实例化对象。

由于构建器对于小类来说可能有点矫枉过正,因此本书建议将其用于具有四个以上参数的类。请注意,构建器是构造函数和静态工厂的替代方案。

Singelton 的一些问题(第 3 项)

  • 如果单例未实现接口,单例将难以测试其客户端,因为您无法模拟单例。
  • 如果使单例可序列化,除非在反序列化时特别小心,否则它们不再是单例。
    • 实现单例的最佳方法是使用单元素枚举类型,这样可以避免序列化问题。

避免创建不必要的对象(第 5 项)

创建对象时应小心。重用昂贵的对象,但不要以防御性复制为代价(为了不可变性——第 39 条)。基元应优先于装箱基元,并在执行自动装箱时注意删除不必要的对象创建。

消除过时的对象引用(第 6 项)

这些书展示了一个堆栈示例,其中弹出项未从内部数组中清空,使它们成为无法被垃圾收集的过时引用。内存泄漏和过时引用的常见来源:

  • 每当一个类管理自己的内存时,程序员应该警惕内存泄漏。
  • 忘记缓存条目。考虑将 WeakHashMap 用于仅在存在对条目的外部引用时才保存项目的缓存。
  • Listeners回调 由于未注销。这里也可以使用 WeakHashMap
标签: Java教程
地址:https://www.cundage.com/article/jcg-effective-java-creating-destroying-objects.html