我读过的Java教程,比如使用嵌套类来演示概念,功能或用途。
这使我最初实现了一个我创建的示例项目:主活动类中有很多嵌套类。
它有效,但现在我得到了一个可怕的单片.java文件。我发现它有点不方便,我现在打算打破多个.java文件/类。
然而,在我看来,有时可能会有理由不从他们的封闭课程中取出课程。如果是这样,考虑到模块化和易维护性,保持模块大的原因是什么?
是否存在将嵌套类转换为顶级类是不切实际(甚至不可能)的情况?换句话说,是否只有嵌套类可以满足某些功能?
答案 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页 - “为什么内在班“?)。据我所知,没有其他方法可以实现它。因此,如果您的嵌套类帮助您实现多个实现继承,那么您将无法使嵌套的顶级类成为可能。
嵌套类允许您干净地分离属于外部类的某些功能,同时使该功能保持接近外部类。在这种情况下,从设计的角度来看,嵌套类提供了最佳选择,仅此一点就是不能使它成为顶级类的原因(这可能导致主程序包中的类污染)。