Java中的模块化:顶级与嵌套类

Java中的模块化:顶级与嵌套类,java,nested,modularity,Java,Nested,Modularity,我阅读的Java教程喜欢使用嵌套类来演示概念、功能或用法 这使我最初实现了一个我创建的示例项目,就像这样:在主活动类中有很多嵌套类 它可以工作,但现在我得到了一个巨大的单片.java文件。我觉得这有点不方便,现在我打算中断到多个.java文件/类 然而,我突然想到,有时可能有理由不将类从封闭类中取出 如果是这样的话,考虑到模块化和易于维护,有什么好的理由使模块保持大型 是否存在将嵌套类转换为顶级类不切实际(甚至不可能)的情况?换句话说,是否存在只有嵌套类才能满足某些功能的情况?如果所有类都在同一

我阅读的Java教程喜欢使用嵌套类来演示概念、功能或用法

这使我最初实现了一个我创建的示例项目,就像这样:在主活动类中有很多嵌套类

它可以工作,但现在我得到了一个巨大的单片.java文件。我觉得这有点不方便,现在我打算中断到多个.java文件/类

然而,我突然想到,有时可能有理由不将类从封闭类中取出

如果是这样的话,考虑到模块化和易于维护,有什么好的理由使模块保持大型


是否存在将嵌套类转换为顶级类不切实际(甚至不可能)的情况?换句话说,是否存在只有嵌套类才能满足某些功能的情况?

如果所有类都在同一个文件中,则更容易读取它们。这就是为什么这种方法对于示例代码是好的


然而,对于真正的代码,您应该将文件/类划分为可管理的大小。Java6中最长的类文件大约有9000行长。我倾向于缩短上课时间

非静态嵌套类具有对封闭类的创建者实例的隐式引用,并且它还可以访问封闭类的每个成员(甚至私有成员)。如果将嵌套类设置为顶级,则会丢失该属性:

public class Outer {
    private String s;

    public void setS(String s) {
        this.s = s;
    }

    public class Inner {
        public String getOuterS() {
            // This is legal only if Inner is
            // non-static and nested in Outer
            return s;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.setS("Hello world!!!");

        // i now has access to every o member
        Outer.Inner i = o.new Inner();

        // Prints "Hello world!!!"
        System.out.println(i.getOuterS());
    }
}
对。内部类(非静态嵌套类)可以引用包含类的实例变量


另外,嵌套类可以访问包含类的私有成员。

除了闭包的好处(已经在另一个答案中指出),嵌套类还可以帮助您实现多实现继承(参考:Java思考,第369页-“为什么内部类”?)。据我所知,没有其他方法可以实现这一目标。因此,如果您的嵌套类帮助您实现多个实现继承,那么就不可能使嵌套类成为顶级类


嵌套类允许您干净地分离属于外部类的某些功能,同时使该功能靠近外部类。在这种情况下,从设计角度来看,嵌套类提供了最好的选择,这本身就是不使其成为顶级类的原因(这可能会导致主包中的类污染)。

Lawery,还破坏了可管理文件中的代码,提高了系统的性能。@Alaa,使类更易于管理可以让您有更多的时间来提高性能等。更简单、更短的代码通常运行得更快,但我不认为使用更大的类会直接影响性能。