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

时间:2011-03-18 16:08:38

标签: java nested modularity

我读过的Java教程,比如使用嵌套类来演示概念,功能或用途。

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

它有效,但现在我得到了一个可怕的单片.java文件。我发现它有点不方便,我现在打算打破多个.java文件/类。

然而,在我看来,有时可能会有理由从他们的封闭课程中取出课程。

如果是这样,考虑到模块化和易维护性,保持模块大的原因是什么?

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

4 个答案:

答案 0 :(得分:4)

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

但是对于实际代码,您应该将文件/类分解为可管理的大小。 Java 6中最长的类文件长约9000行。我倾向于让课程比这短。 ;)

答案 1 :(得分:2)

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

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());
    }
}

答案 2 :(得分:1)

是。内部类(非静态嵌套类)可以引用包含类的实例变量。

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

答案 3 :(得分:1)

除了闭包的好处之外(在其他答案中已经指出),嵌套类还可以帮助您实现多重实现继承(参考:Thinking in Java,第369页 - “为什么内在班“?)。据我所知,没有其他方法可以实现它。因此,如果您的嵌套类帮助您实现多个实现继承,那么您将无法使嵌套的顶级类成为可能。

嵌套类允许您干净地分离属于外部类的某些功能,同时使该功能保持接近外部类。在这种情况下,从设计的角度来看,嵌套类提供了最佳选择,仅此一点就是不能使它成为顶级类的原因(这可能导致主程序包中的类污染)。