非公共顶级类与静态嵌套类

Ste*_*hen 18 java class-design

在我看来,非公共顶级类和静态嵌套类在创建辅助类时基本上执行相同的任务.


A.java


public class A 
{
    public static main (String[] args)
    {
        AHelper helper = new AHelper();     
    }
}
class AHelper {}
Run Code Online (Sandbox Code Playgroud)


A.java


public class A
{
    public static main (String[] args)
    {
        A.AHelper helper = new A.AHelper();     
    }

   static class AHelper {}
}
Run Code Online (Sandbox Code Playgroud)


除了它们的引用方式之外,我认为创建辅助类的两种方式之间差别不大.它可能主要归结为偏好; 有没有人看到我错过的任何东西?我想有些人会认为每个源文件有一个类更好,但从我的角度来看,在同一个源文件中有一个非公共顶级类似乎更干净,更有条理.

dan*_*ben 14

在两个示例中,每个源文件都有一个类.但通常,您使用静态嵌套类来表示它仅用于在其封闭类中使用(强制它被引用为A.AHelper).如果你把那个班级提升到最高水平,那就不那么清楚了.

来自Sun教程:

类的逻辑分组 - 如果一个类只对另一个类有用,那么将它嵌入该类并将两者保持在一起是合乎逻辑的.嵌套这样的"帮助类"使得它们的包更加简化.


Yon*_*oni 5

想到的一件事是辅助类的范围.嵌套类可以访问父类的私有成员.如果帮助程序位于其自己的文件中,则您不享受此类访问权限,尽管使用默认程序包可见范围很容易处理.

另一个考虑因素是代码重用 - 您可能希望帮助程序帮助您的包中的几个类.

  • Danben.我想我做对了.只是在Eclipse中尝试使用最少的样本并且它可以工作.public class Outer {private static int foo = 5; static class Inner {private static void print(){System.out.println(foo); }}} (2认同)
  • 另一个引用:"成员类声明(§8.5)描述了作为周围类成员的嵌套类.成员类可能是静态的,在这种情况下,它们无法访问周围类的实例变量;或者它们可能是内部类(§8.1.3)." 这似乎暗示...... (2认同)

Kev*_*ock 5

一个区别是静态嵌套类可以声明为public.您不能对与主类相同的文件中的任何其他类执行此操作,因为公共主级别必须与文件名同名.

因此,您可以在一个文件中声明许多公共类,但只有一个是主级别.其他静态嵌套类应该与主类相关,否则实际上没有意义.