【问题标题】:Why to favor static member classes over nonstatic (Joshua Bloch Item #22)?为什么偏爱静态成员类而不是非静态成员类(Joshua Bloch Item #22)?
【发布时间】:2017-05-16 10:06:41
【问题描述】:

在读了这本书的那部分两遍之后,我仍然不明白为什么这么广泛地陈述。 非静态成员类是语言的一部分。同意并非任何编程语言的所有部分都是完美的。具有非静态成员类的优点,它们可以访问封闭实例的方法,因此很少会超过可能增加的代码复杂性(内部类和外部类之间的耦合更紧密。顺便说一句:静态成员也可以访问外部类的字段类,只要外部类也是静态的)?本书的这一部分并没有真正给出任何缺点。

适配器模式的非静态成员类呢?建造者模式?

对于小对象(类似于 C++ 的结构)的非静态成员类如何保存一些属于一起且属于外部类的数据位(因此没有理由将它们设为静态)?

(这里的 Effective Java 2nd Edition 似乎有一个很大的摘录,作者是 Joshua Bloch:http://jtechies.blogspot.com/2012/07/item-22-favor-static-member-classes.html - 以防万一有人手边没有这本书,要知道我的起点是)。

【问题讨论】:

  • 他没有提到与非静态类所需的外部实例引用相关的空间/时间开销吗?
  • 如果布洛赫本人没有给出可接受的理由,则没有理由遵循他的建议。 “摘录”要么是抄袭,要么是未经审查的第三方评论。
  • @EJP:我不会评论不知名的人发布的内容。该链接是我在谷歌上搜索得到的答案。我给它是为了方便这个线程的读者。我的怀疑与 J.B. 原著 (2dn ed.) 中包含的文本有关。
  • 说喜欢静态嵌套类而不是内部类并不是太“笼统”。它不反对使用内部类,只需要完全理解它们的用例。不需要“使[嵌套类型]静态的理由”,_au 相反,它需要一个理由不这样做。另一件事,包含类只能是静态的,如果它们也是嵌套的,双重嵌套类型是不好的。

标签: java design-patterns


【解决方案1】:

本书的第 22 条清楚地解决了您的担忧。

为什么偏爱静态成员类而不是非静态成员类(Joshua Bloch Item #22)?

答案:

如果你声明一个不需要访问封闭的成员类 例如,总是将 static 修饰符放在其声明中,使其成为静态而不是非静态成员类。如果省略此修饰符,每个实例都会对其封闭实例有一个无关的引用。存储此引用会耗费时间和空间,并且可能导致封闭实例在其他情况下符合垃圾收集条件时被保留(第 6 项)。如果你需要分配一个没有封闭实例的实例,你将无法这样做,因为非静态成员类实例需要有一个封闭实例。


适配器模式的非静态成员类呢?建造者模式?

答案:

非静态成员类的一个常见用途是定义一个适配器 [Gamma95, p. 139]允许将外部类的实例视为某个不相关类的实例。例如,Map 接口的实现通常使用非静态成员类来实现它们的集合视图,这些视图由MapkeySetentrySetvalues 方法返回.类似地,集合接口的实现,例如SetList,通常使用非静态成员类来实现它们的迭代器:

// Typical use of a nonstatic member class
public class MySet<E> extends AbstractSet<E> {
    ... // Bulk of the class omitted

    public Iterator<E> iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<E> {
        ...
    }
}

【讨论】:

  • 这个答案是正确的。然而,它完全由 OP 已经阅读的材料组成,所以它并没有真正添加任何东西(这更像是关于问题的陈述而不是答案,要清楚:)
  • @OliverCharlesworth 我没有看到我在他的链接中引用的第一段(老实说,我没有仔细阅读那里的所有文字,我只是回答了)。
  • 感谢 cmets。确实,user1803551 突出显示了此处的关键段落。只是项目#22 的标题似乎与它们不匹配/总结。我觉得@EJP 指出了这一点:如果没有很好的基础,请不要盲目地遵循所写的内容(或者在这种情况下:不要仅依靠粗体标题,将文本视为一个整体)。不幸的是,他没有将他简洁的话语扩展到一个被接受的答案。
  • @ArturOpalinski 第 22 条实际上是对嵌套类的简短回顾,其中大部分讨论的是静态和非静态成员类。 EJP 的评论无关紧要,因为布洛赫确实给出了遵循他的建议的确切理由。这个答案准确地回答了这个问题(尽管我只是引用了他的书)。
  • @ArturOpalinski 你有什么理由不想接受这个答案吗?
猜你喜欢
  • 2012-01-21
  • 2012-04-13
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多