【问题标题】:Visibility between classes in a "matrioska" package“matrioska”包中的类之间的可见性
【发布时间】:2012-01-12 09:22:24
【问题描述】:

我在a 包中有A 类。

a.b 包中拥有B 类之后。 B 包含方法 m()

我想打电话给m() 在里面并且只在里面A。确切地说,我不想将m() 设置为public

有可能吗?

抱歉标题。我没有找到更好的。

编辑澄清:AB 类必须由开发人员使用(它们形成 API)并且在 A 内部我有一个私有方法可以计算修改 B 对象的东西,但是这不能由开发人员调用。 aa.b 包之间除了它们对应的文件夹在另一个中之外还有其他关系吗?

Edit2:A 类包含 List<B>A 是必须与服务器对话的类,它以一个值响应。 A 必须在列表中的每个元素中插入此值。

【问题讨论】:

  • 您是说您希望A 明确了解非子类中包含的内容,但不将m() 暴露给A 以外的任何内容?
  • 方法m() 不能/不应该在课堂A 中有什么原因吗?对我来说这似乎是合乎逻辑的,因为这是您唯一需要/想要使用它的地方
  • @DaveNewton 是的,类似。
  • @HunterMcMillen 在简短的类A 包含List<B>A 是必须与服务器对话的类,它以一个值响应。 A 必须在列表中的每个元素中插入此值。

标签: java package visibility


【解决方案1】:

除非A子类B(我不会为了继承而这样做),AB之间基本上没有“特殊”关系,所以没有办法这样做,恐怕。

您究竟需要在这里防范什么?只是不相信自己或同事不会在正确的时间调用该方法,还是更强大的问题?您可能会在执行时检查堆栈,尽管这对于内联等可能会造成混乱是很危险的 - 而且它仅在执行时。

【讨论】:

  • 简而言之,AB 类必须由开发人员使用(它们形成一个 API)并且在 A 内部我有一个私有方法来计算修改 B 的东西对象,但这不能由开发人员调用。 aa.b 包之间除了它们对应的文件夹在另一个中之外还有其他关系吗?
  • @Baduel:不,就 Java 而言,包的层次结构无关紧要。
  • 因此我的问题永远不会有一个好的答案。这意味着我在设计步骤中犯了一个错误。非常感谢。
【解决方案2】:

有一种方法可以使用反射和一些黑客攻击来做到这一点,但这样做会非常糟糕。 我可以推荐阅读更多关于访问级别的内容

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

 Access Levels
 Modifier   Class   Package  Subclass World  
 public      Y      Y         Y        Y
 protected   Y      Y         Y        N
 no modifier Y      Y         N        N
 private     Y      N         N        N

【讨论】:

  • 是的,我知道。但真正的问题是:如果没有任何父母关系,为什么我应该使用parent.son 包?还是这种关系存在?
  • 从这个意义上说它不是父级,它更像是对做类似事情的各种类进行分组
  • 所以我的大胆问题的答案是:不,没有?
  • 粗体问题:a 和 a.b 包之间除了对应的文件夹在另一个中之外,还有其他关系吗?你的回答:你做错了。回答前请仔细阅读问题。
【解决方案3】:

使 m 受保护并使 A 扩展 B。这对您的模型有用吗?

【讨论】:

  • 很遗憾,我无法采用此解决方案,因为我的代码中会出现逻辑错误。
  • 您应该在您的问题中提到这一点 :-) 无论如何,另一种方法是将 A 和 B 放在同一个包中,并使 m 具有包级别的可见性(默认访问)。除此之外,没有真正的办法。根据您的要求,B 可能是 A 的私有内部类,但您需要更好地定义您的要求
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 2018-09-30
  • 1970-01-01
  • 2015-09-02
  • 2011-01-25
  • 1970-01-01
  • 2015-01-02
  • 2011-03-02
相关资源
最近更新 更多