【问题标题】:Java static nested class vs top level classJava静态嵌套类与顶级类
【发布时间】:2013-10-30 22:54:24
【问题描述】:

我对何时创建 Java 类感到困惑:

  • 静态嵌套类
  • 同一包中的顶级类
  • 另一个包中的顶级类

例如

class School {
    static class Grade {
        static class Class {
            static class Student {
            }
        }
    }
}

这是一个逻辑上好的设计吗?它将对象放在逻辑层中。如果类没有以这种方式嵌套,逻辑层会污染命名空间。学生可能会去其他地方。为 Student 创建一个包会更好吗?

这个结构应该嵌套还是展平?

【问题讨论】:

  • 一般来说,如果你只在外部类中使用那个特定的类,你可以将它保留为嵌套类。但是,为什么要在问题中创建这种层次结构是没有意义的。您可以将所有 Grade、Class、Student 设置为 School 内的嵌套类(如果您想坚持这种设计)
  • 对此没有单一的答案。多个答案,谷歌搜索,见docs.oracle.com/javase/tutorial/java/javaOO/nested.htmlstackoverflow.com/a/2148749/18573,http://stackoverflow.com/a/…有一些很好的信息
  • 扁平化,如果您担心名称空间,请使用包。如果这些类开始包含大量内容,您的设计将是文件大小的恐怖。
  • @Ioan 不一定/只是,另一种情况是当嵌套类需要访问私有成员时,我想到的是不可变类的构建器模式。
  • @TC1 好吧,我认为你错了。如果内部类是静态的(嵌套的),它将无法访问其外部私有成员。 (仅限静态成员)

标签: java static nested


【解决方案1】:

在我看来:扁平化。因为学生不会永远留在同一个班级。

【讨论】:

  • 同意。甚至在同一个年级或学校。
【解决方案2】:

展平。这看起来有点像您将实例封装的想法与命名空间混为一谈。一个 School 实例可能包含对学生的许多引用,但没有理由将 Student type 限定在 School 类型内。

学生可能意味着其他地方的学生服装。

Student 绝不应该是指 student 以外的任何东西。应该和衣服没有关系。

如果我们为他们创建一个包,它会好一点。

是的,包是组织类型的容器。除非嵌套类型,否则不应以这种方式使用类型本身:

  1. 与外部类型的耦合如此紧密,以至于它本身毫无意义。

  2. 是一个通用概念,以特定于外部类的方式表现出来。例如,Map.Entry 适合作为嵌套的静态类型(接口),因为“条目”是一个通用概念,而这种特定类型的条目仅在处理地图时才相关。

  3. 仅在其外部类中使用,在其外部不可见(或至少在包外部不可见)。

【讨论】:

    【解决方案3】:

    当您想对其他类“隐藏”它们的代码时,或者当您想将该代码与封闭类相关联时,嵌套静态类通常很好。

    它们不常用于您​​的示例中的多级封装,或者当它们相当大(例如,超过 100-200 行)时,因为它们变得难以维护。在这种情况下,您应该更好地使用包。

    可以在earlier StackOverflow question 以及Java Tutorial.

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多