【问题标题】:Why does Bloch state that it is impossible to subclass collections implementations?为什么 Bloch 声明不可能对集合实现进行子类化?
【发布时间】:2018-02-10 01:05:21
【问题描述】:

在“Effective Java”一书中,Joshua Bloch 说:“不可能在 Collection Framework 中对任何便利实现类进行子类化”。

如果ArrayList、LinkedList、HashSet等有公共构造函数并且可以很容易地被子类化,他为什么要指出呢?

能否请您解释一下为什么我们不能通过不可变类扩展可变类?

如果不可变类具有包私有构造函数和字段并且可以由可变子类修改,则不可变的实例将仅为子类创建,用户将不会使用父类。

【问题讨论】:

  • 他不谈论LinkedList。他谈到了java.util.Collections$SingletonSetjava.util.Arrays$ArrayList
  • 他的意思可能是说使用工厂方法时跨度>
  • 我也不明白您所说的“我们不能用不可变的类扩展可变类”是什么意思。这对你来说代表着什么?扩展可变类并覆盖所有突变方法以引发异常绝对是可能的。
  • 我问的是如何通过一个可变的来扩展一个不可变的类,因为我起初认为我们不能仅仅因为它们是不可变的而扩展集合。

标签: java collections immutability


【解决方案1】:

阅读更广泛的报价:

只提供静态工厂方法的主要缺点是 没有公共或受保护构造函数的类不能被子类化。这 公共静态工厂返回的非公共类也是如此。例如, 不可能子类化任何便利实现类 集合框架。

它在谈论诸如Collections.unmodifiableListCollections.singletonCollections.synchronizedMap 之类的东西:你不能子类化这些方法返回的类型。

【讨论】:

  • 对不起。我可以对 Collections.unmodifiableList 返回的类型进行子类化。是列表
  • @Pavel 这不是子类化的意思。
猜你喜欢
  • 1970-01-01
  • 2013-01-27
  • 2015-02-13
  • 2013-01-16
  • 2019-02-26
  • 2019-12-10
  • 1970-01-01
  • 2018-10-14
  • 2016-04-05
相关资源
最近更新 更多