【问题标题】:Java Inner Class Access and Best PracticesJava 内部类访问和最佳实践
【发布时间】:2013-11-18 12:13:03
【问题描述】:

我知道内部类可以访问外部类中的所有内容(因为它是该类的成员),但反过来呢?

  1. 外部类是否可以访问内部类中的私有变量和方法?

  2. 我看过文章提到内部类应该是私有的,以便它们只能被外部类访问。这对内部类的可访问性有什么影响?

  3. 当涉及到您的内部类时,处理访问级别的最佳实践是什么?我假设封装越多越好,但这是否以牺牲可访问性为代价?

【问题讨论】:

  • Thinking in Java 的第 8 章。
  • 你的第一个问题在这里得到了相当彻底的回答:stackoverflow.com/questions/1801718/…
  • 感谢该链接...我在发布之前进行了搜索,但肯定错过了那个链接。因此,如果外部类可以完全访问其内部变量/方法,我会假设将所有内容设置为私有是最安全的做法。

标签: java oop inner-classes


【解决方案1】:

Effective Java (2nd edition) Item 22: "Favor static member classes over nonstatic" 中详细介绍了该主题。

简要总结:

  1. 内部类不应访问外部类实例,除非需要访问,即默认情况下内部类应为static。为了获得技术性,Effective Java 调用这些 静态成员类,而不是 内部类,并使用术语 嵌套类 来包含静态和非静态版本。
  2. 外部类始终可以访问其内部类的成员,即使这些成员是private。通过这种方式,内部类只能将自身暴露给其外部类。
  3. “一个内部类的存在应该只为它的外部类服务。”

就个人而言,我倾向于实现一个内部类,只要这样做允许内部类的构造函数为private,即当一个类只能从另一个(外部)类实例化时。任何额外的封装,例如使整个内部类private,都是可取的;但是public 内部类是完全可以接受的。 Java中有很多例子,比如AbstractMap.SimpleEntry

【讨论】:

  • 谢谢,这正是我想要的。
  • 重新“有效的 Java”。如果你还没有读过,你应该读过——我读过的关于 Java 的最好的书。 (但不是教程或介绍。)
猜你喜欢
  • 2018-01-04
  • 2015-03-18
  • 1970-01-01
  • 2018-05-24
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多