5

在 Java 中使用嵌套类有什么好处?在许多示例中,在我看来它只会增加设计的复杂性。与例如复合模式相比,是否有任何示例显示使用嵌套类的强大功能?

4

6 回答 6

9

为什么使用嵌套类?

使用嵌套类有几个令人信服的理由,其中包括:

  • 这是一种对仅在一个地方使用的类进行逻辑分组的方法。
  • 它增加了封装。
  • 嵌套类可以产生更易读和可维护的代码。

(来自文档

我认为我能想到的最好的情况是在某种集合类(树、链表、地图等)中实现节点。节点实现没有理由向公众公开,并且由于它仅由集合的内部使用,因此将节点类嵌套在集合类中是有意义的。

类似的东西..

public class MyTree {
  private class TreeNode {
    //implementation details...
  }

  //public api, where implementation references TreeNode
}
于 2013-01-08T16:08:43.320 回答
4

我会在一个案例中使用嵌套类,我主要需要在周围的类中使用这个类。这可能是事件监听器之类的用法。

或者在我需要实现特定接口作为 API 方法的参数并且只在这个特定的顶级类中创建这个结构的情况下。

这避免了创建更多的顶级类——弄乱你的代码库——这对任何其他类都没有用。

希望这可以帮助。:)

于 2013-01-08T16:08:29.223 回答
2

与例如复合模式相比,是否有任何示例显示使用嵌套类的强大功能?

几乎所有的 Iterator 实现以及 keySet() 和 values() 的实现都是嵌套的。实际名称并不重要,但他们需要访问外部类才能完成工作。

拥有这些顶级类不会是优雅的或封装的。

于 2013-01-08T16:10:59.463 回答
2

我可以想到很多使用嵌套类的例子

1- 扩展一个类,以便在这个实例中使用它,其行为与通常不同(覆盖一个方法或更多)

2-在一个步骤中实现事件侦听器并将其传递给任何方法的简写

3-实现一个过于具体而无法全局定义的类(或具有包可见性或私有或其他)。而你只是想把它隐藏到更大的类中

我确实同意,尽管内部类的使用会使代码复杂化,无论您如何努力使 for 格式化程序变得漂亮,但它有它的用途,所以根据我自己的经验法则,我只在确定时才使用内部类以上其中一项适用,并且它的大小将最小,以免破坏我的代码

并且对于那个mattar,保持所有代码最小化:)

于 2013-01-08T16:12:06.427 回答
0

当我们知道此类将主要仅由将要写入的类使用时,我们使用嵌套(内部)类。它使包装结构保持清洁。通过使用 IDE 可以降低复杂性,您可以在其中轻松找到未在包结构中列出的类。

于 2013-01-08T16:14:03.040 回答
0

根据要求提供真实示例,请查看ArrayListjdk 的实现。
你可以在这里找到它:http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/ArrayList.java#ArrayList

您将在 Arraylist 类中找到(除其他外)迭代器类。我猜想,这种行为的原因(对于大多数可迭代集合子类)是集合与其迭代器之间的直接连接。你在课堂之外不需要它。

您可以在 jdk 内的更多地方找到嵌套类。

于 2013-01-08T16:24:30.700 回答