私有嵌套/内部类的目的是什么?

时间:2013-10-23 03:53:41

标签: java class private

我的印象是私有内部/嵌套类仅用于外部类/由/访问。但实验我意识到HashSet(不是Happy的外部类)可以访问该类。如果是,那么private的实际用途是什么?是否只限制类的创建到外部类中?

public class FreeMain {

    private static class Happy {
       int x; 
       private Happy(int x) {
           this.x = x;
       }

       @Override
       public boolean equals(Object o) {
           return true;
       }

       @Override
       public int hashCode() {
           return 10;
       }
    }

    public static void main(String[] args) {
        Set<Happy> happiness = new HashSet<Happy>();

        Happy h1 = new Happy(10);
        Happy h2 = new Happy(20);

        happiness.add(h1);
        happiness.add(h2);
    }   
}

2 个答案:

答案 0 :(得分:3)

Access modifiers in Java控制范围,其中可以合法访问或引用标识符。您使用私有嵌套(static =&gt;嵌套,非静态=&gt;内部)类作为HashSet的类型参数 - 但引用仍然发生在父类的范围内。

  

如果是这样,那么Private的真正用途是什么?它只是限制在外部类中创建类吗?

不,它不仅限制创作。您甚至无法在Happy类之外引用类型FreeMain。如果您尝试声明类型为Happy的内容,或者使用Happy作为类Set<Happy>之外的类型参数(如FreeMain),则会出现编译错误。< / p>


  

总而言之,如果对私有嵌套类的引用传递给另一个类(如set),只要它在freemain范围内,它就可以工作。

是的,这基本上是正确的。但是,当您声明Set时,该类型并未真正“传递”到Set<Happy>Set类中的所有代码都没有看到您在参数中提供的实际类型(由于type erasure)。 Java编译器只使用您在类型参数中指定的信息作为一种类型断言来检查程序的正确性。

当您声明Set<Happy> happiness时,happiness包含Happy个实例的事实在任何地方都不知道,但在happiness的范围内。因此,Happy类型实际上从未在FreeMain类的范围之外使用,这就是为什么即使Happy是私有的,它也是合法的。

答案 1 :(得分:0)

使用嵌套类的令人信服的理由包括:

这是一种逻辑分组仅在一个地方使用的类的方法:如果一个类只对另一个类有用,那么将它嵌入该类并将两者保持在一起是合乎逻辑的。嵌套这样的“辅助类”使得它们的包更加简化。

它增加了封装:考虑两个顶级类A和B,其中B需要访问A的成员,否则这些成员将被声明为私有。通过将类B隐藏在类A中,可以将A的成员声明为私有,并且B可以访问它们。此外,B本身可以隐藏在外面。

它可以带来更易读和可维护的代码:在顶级类中嵌套小类会使代码更接近使用它的位置。