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

时间:2010-01-27 16:47:45

标签: java class-design

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


A.java


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


A.java


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

   static class AHelper {}
}


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

4 个答案:

答案 0 :(得分:14)

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

来自Sun tutorial

  

类的逻辑分组 - 如果是类   仅对其他一个类有用,   那么将它嵌入其中是合乎逻辑的   上课并将两者放在一起。   嵌套这样的“助手类”使   他们的包装更精简。

答案 1 :(得分:5)

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

嵌套一个类(静态地用Java)发送一个明确的 intent 消息:嵌套类AHelper仅与支持A类相关且可用。它本身没有意义,这是显而易见的。