【问题标题】:Accessing package in java [closed]在java中访问包[关闭]
【发布时间】:2012-09-15 21:11:51
【问题描述】:

我有一个 Java 包结构,它应该可以访问,如下所示。

如何让底层包类只能被中间包访问? TestApp 应该只与接口包直接通信。 TestApp 不应获得有关基础和中间包类的任何信息。怎么做?请帮忙

【问题讨论】:

  • 为什么要这样做?是因为你不信任TestApp的开发者吗?如果您只能使用接口,您如何使用“中间包”?
  • 这会有帮助吗? Access Modifiers In Java
  • 接口包中调用中间包方法
  • 所以我假设接口代码不仅仅是接口。 ;) 虽然能够做到这一点可能很好,但您还没有说明为什么需要它,但可能还有另一种方法可以解决您的问题。

标签: java oop class packages


【解决方案1】:

您可以将 TestApp 和 Interface 放在同一个包中。然后 Interface 必须继承 Middle 使用 protected 方法。然后 Middle 在使用 package protected 方法的同一个 Package of Underlying 中。

它做你想做的事,但老实说,我认为这样做没有任何意义。它假设“接口包”不是Java接口......

Ceylon Language 可能对代码单元和模块有更好的概念,但 Java 6,7 和 8 语言还没有准备好向其他程序员真正隐藏东西。

【讨论】:

  • 底层、中间层和接口层组成一个jar。所以不要把TestApp和Interface放在一个包里
  • 是的,你可以。当 jar 在 JVM 中解压后,它和其他目录一样是一个目录。您将新的 TestApp 与包的名称相同,就是这样。老实说,如果这是客户的需求,只需告诉他们它不是那样工作的。你可以用你的代码来隐藏 Http 请求,但不能用 JVM 来隐藏别人的代码。
【解决方案2】:

这是不可能的。
您可以设置对类的包访问权限,但是从其他包调用它们会遇到困难。这意味着从中间包到底层包的访问本质上与从TestApp到底层包的访问是相同的。
UPD:我看到了关于继承的答案,但它并没有完全解决问题——你可以从 TestApp 中的底层包继承,没有什么能阻止你。
UPD2:顺便说一句,你的要求让我想起了 C++ 中的friend 关键字。它在 Java 中不存在。

【讨论】:

    【解决方案3】:

    不可能在 Java 中使用“朋友”系统来指定对包成员的更细粒度的访问。如果您让某个包外的东西可见,那么该包外的任何东西都可以访问它。

    您可以为 TestApp 和 Interface Package 包使用一个通用包,但这在语义上并不正确 - 您将客户端与接口混合在一起。

    如果您想强制执行模块化,OSGi 允许您将单元内的某些包标记为“内部” - 这些根本不会暴露(“有线”)给客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 2013-12-18
      • 1970-01-01
      相关资源
      最近更新 更多