创建和销毁对象(第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