【问题标题】:Java nested package visibilityJava 嵌套包可见性
【发布时间】:2014-10-10 14:44:11
【问题描述】:

当我设计项目的一些新组件时,我经常遇到一个限制,我无法以正确的方式解决......

想象一个包“组件”,在这个组件包中,您有一些公共类/接口,它们自然设计为公开共享,还有一些内部包中需要但不应该从外部可见的类/接口(ComponentSpecificStuff)包...

现在使用当前的 java 可能性,我实现这一点的唯一方法是违反(不暴露“组件”包之外的东西)时刻......

您如何解决这个问题?

【问题讨论】:

  • Java 中没有“内包”这样的概念。就编译器而言,包不是分层的——“分层”实际上只是用于组织的人类模式匹配。

标签: java package


【解决方案1】:

是的,您可以通过在包名称中使用 internal 关键字来达到一定程度。
例如你有一个包

com.myPackage.component

你可以有另一个包

com.myPackage.component.internal.blahblah

当你使用关键字 internal 时,它不会暴露给其他 jar,也不能在 jar 外部使用,但可以在 jar 内部被另一个包使用。在这里,内部包将com.myPackage.component 进一步向下扩展。正如Jon Skeet Packages are not hierarchical as far as the compiler is concerned - the "hierarchy" is just human pattern matching for organization, effectively. 所引用的那样,这就是我进一步扩展包的意思。


编辑

您可以通过不给类提供任何访问修饰符来定义类包私有 示例:

class PackagePrivateClass{

}

你可以在同一个包中导入这个类,但在包外它不允许你使用它。

【讨论】:

  • 谢谢,虽然我不知道内部包的特殊含义,但这是问题的部分答案......在某些情况下,仅仅为了使内部的东西不可见而设计项目是不合理的.. . 所以我想我所描述的对于我们拥有的当前 java 来说是不可能的?
  • 我听说 java 9 jigsaw 即将为此做点什么。
  • 我知道包保护的可见性。整个问题是它不仅不允许在外部,也不允许在内部,但我明白你的意思,它不是等级制度……太糟糕了:(
  • 当您将公共类放入这些内部包中时,在类路径中包含此 jar 的类仍然可以访问它们。
  • @Dormouse 我不这么认为,因为在创建 Jar 时,命名类加载器的包中的 internal 关键字不会导出该包中的那些类。你可以在同一个 jar 中使用它你将无法在导入 jar 的地方使用它。
猜你喜欢
  • 2018-09-22
  • 2015-03-31
  • 1970-01-01
  • 2011-08-05
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多