【问题标题】:Why should I use nested classes? [closed]为什么要使用嵌套类? [关闭]
【发布时间】:2013-01-04 10:58:21
【问题描述】:

什么时候可以嵌套类? 我看到的最常见的优点是“共享范围”(跨类使用变量)。

与将嵌套类放在它自己的文件中并通过构造函数传递参数相比,这是否更不吸引人/不是最佳实践?

【问题讨论】:

  • 除了范围优势之外,只有内部类可以是静态的,并且可以用来存储实用方法。
  • 每当我在课堂上需要一个数据结构时,我都会亲自使用它,但不必公开这个数据结构。这是最佳实践吗?我不知道,但它对我很有效。据我了解,这在某种程度上也用于“默认”Java 结构,如 LinkedList 等。
  • 有趣的事情 - 我一直认为嵌套类是一种禁忌,就像一种作弊方式或一种黑客行为并且可读性较差。猜我错了
  • @DaneBalia 我仍然认为他们是这样的。大多数想使用内部类的情况都应该使用包来处理。

标签: java scope inner-classes


【解决方案1】:

使用nested classes有几个原因,其中:

  1. 这是一种逻辑分组只在一个地方使用的类的方法。

  2. 它增加了封装

  3. 嵌套类可以产生更多可读和可维护的代码

  4. 子类与父类的连接更简单,因为它直观地说明每个类的变量和方法。

【讨论】:

  • 也用于导出比封闭类提供的功能更深的功能,例如 IteratorsCollections
  • 而且调试也更容易了
  • 我对原因 #2 持怀疑态度。对于封装,所有语言都有访问说明符,如私有、公共保护等。我发现很难将嵌套类的概念视为增加封装的一种方式.即使没有嵌套,您也可以控制类的可访问性。如果我错了,请纠正我。
  • @dd619 嵌套如何帮助简化调试。为了清楚起见,您能否添加更多内容。每当您调用嵌套类的 API 时,控制流仍会到处跳转。不是吗?
  • @RBT: 抱歉回复晚了。嵌套类使得调试代码更容易,因为调试控制流和监视保留在父类中,并且嵌套类的上下文显示所有变量、监视、表达式和当前调试器进程中的线程(例如,我们可以轻松比较参数值从父类到嵌套类的变化)。
【解决方案2】:

当我需要将一组相关字段传递给一个方法并在类内的几个方法调用中操作同一组数据时,我发现私有静态类很有用。类似于 LinkedList.Node 类,它不暴露在外部,而是用于将链接分组为一个单元。

【讨论】:

    【解决方案3】:

    除了已经提到的那些,另一个好处是:

    • 嵌套类还可以帮助您实现多重实现继承(参考:Thinking in Java,第 369 页 - “为什么选择内部类”部分?)。据我所知,在 Java 中没有其他方法可以实现它。

    【讨论】:

      【解决方案4】:

      据我所知,当使用嵌套类时,当我们看到一个对象(OBJ1)与第二个对象(OBJ2)紧密绑定时,如果没有第二个对象(OBJ2),我们就无法创建第一个对象(OBJ1)。例如,我们有一个员工对象,一个关联的对象是薪水,我们不应该独立创建薪水对象。因为没有我们要发薪水的员工。
      如果我错了,请提供您的反馈。

      第二种情况,当我们使用 map 或 map 时,我们可以使用嵌套类来移除 map 的 map 以使代码易于理解。

      第三个当我们想向客户端发送数据时,我们可以将其发送到包含所有数据的单个对象中:)

      当我们需要可以定义外部类的组件或者我们想要定义适配器时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 2010-10-01
        • 2017-02-17
        • 2011-08-21
        • 2015-03-11
        • 2013-02-17
        相关资源
        最近更新 更多