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

这是Joshua Blochs的《 有效的Java》第2章的简短摘要。我仅包括与自己相关的项目。

静态工厂(项目1)

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

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

使用静态工厂(例如,使用私有构造函数)的主要缺点是无法对该类进行子类化。

用构造器代替具有许多参数的构造器(项目2)

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

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

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

由于建造者对于小班制可能会显得过大,因此本书建议将其用于具有四个以上参数的班级。 请注意,对于构造函数和静态工厂而言,构造函数都是替代方法。

与Singelton的一些陷阱(项目3)

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

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

创建对象时应小心。 重复使用昂贵的物品,但不要以防御性复制为代价(出于不变性–项目39)。 应优先于盒装基元使用基元,并且在执行自动装箱以消除不必要的对象创建时要格外小心。

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

这些书显示了一个堆栈示例,其中弹出项目不会从内部数组中清空,从而使它们成为无法进行垃圾回收的过时引用。 内存泄漏和过时引用的公共来源:

  • 每当类管理自己的内存时 ,程序员都应该对内存泄漏发出警报。
  • 忘记缓存条目。 考虑将WeakHashMap用于缓存,该缓存仅在外部引用条目时才保存项目。
  • 缺少注销的监听器回调 。 同样在这里可以使用WeakHashMap

翻译自: https://www.javacodegeeks.com/2017/05/effective-java-creating-destroying-objects.html