【问题标题】:What is the purpose of a private nested/inner class?私有嵌套/内部类的目的是什么?
【发布时间】:2013-10-23 03:53:41
【问题描述】:

我的印象是私有内部/嵌套类仅用于外部类/由外部类使用/访问。但是通过实验我意识到HashSet(不是Happy的外部类)可以访问该类。如果是这样,那么 private 的真正用途是什么?是否仅将类的 creation 限制在外部类中?

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

【问题讨论】:

  • 已经有一段时间了,但是类 HashSet 无法将它的鼻子伸进 FreeMain 并访问其中的私有类或变量(沿着 class.variable 或 class.innerclass 的行。但是我想(未经测试)如果您创建了私有类的实例并将其传递给某人,那么它就可以使用它。当我很久以前学习 java 时,它没有 Set<...> 所以我不知道。
  • 什至 what HashSet?你有什么问题?

标签: java class private


【解决方案1】:

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

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

不,它不仅限制了创作。您甚至不能在 FreeMain 类之外引用类型 Happy。如果您尝试声明类型为 Happy 的内容,或者在类 FreeMain 之外使用 Happy 作为类型参数(如 Set&lt;Happy&gt;),则会出现编译器错误。


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

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

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

【讨论】:

  • 总而言之,如果将私有嵌套类的引用传递给另一个类(如 set),只要它在 freemain 范围内,它就可以工作。
  • @JavaDeveloper - 是的,这基本上是正确的。请参阅我的更新答案。
  • @DaoWan 很好的答案。谢谢!!
【解决方案2】:

使用嵌套类的令人信服的原因包括:

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

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

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

【讨论】:

  • 我的问题是使内部/嵌套类成为私有类有什么好处/用途。感谢您的回答,但问题不同。
猜你喜欢
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2013-10-11
  • 2011-02-25
  • 1970-01-01
  • 2012-07-09
  • 2020-06-24
相关资源
最近更新 更多