【问题标题】:Is there a way to use package-private in java to allow other packages access?有没有办法在 java 中使用 package-private 来允许其他包访问?
【发布时间】:2015-07-21 22:35:19
【问题描述】:

所以我已经在 C# 领域工作了很多年,现在我在 Java 领域工作。在 C# 中,您可以使用 internal 关键字从公共视图中隐藏类/方法,但如果您特别授予它,则允许某些程序集/包访问。当我在 Java 中环顾四周时,我看不到任何与内部相同的东西。

我发现了 package-private。但是,这使它对外界完全隐藏。 Java 中有没有办法允许某些其他包访问内部代码而不将其公开?

如果您问我为什么要这样做,答案通常是单元/集成测试,或者需要让某些受信任的包访问代码以不重复它。我知道有些人认为您不应该测试私有/内部代码。我也知道允许内部访问通常不是好的软件工程。我对这些话题的讨论并不感兴趣,只是好奇你能不能做我想做的事。

谢谢。

【问题讨论】:

  • Java 中没有机制可以满足您的需求。
  • 你最多可以保护你的类。然后,同一包中的其他类将可以访问它。
  • 补充@Zahrec 的评论:如果这些其他类是具有受保护成员的类的子类,则包外的其他类可以访问它。这可能是您能得到的最接近您想要的东西。

标签: java c# internal package-private


【解决方案1】:

Java 没有像 .NET 中那样的程序集概念(至少现在还没有)。最接近的是 OSGi 包,它有这个概念(x-internal、x-friend 等),但这并不是真正的核心 Java。

如果您不使用 OSGi,则无需经历这个复杂的过程。只要确保您的单元测试与被测类在同一个包中。 Maven 目录结构(即使您不使用 Maven,这也是一个不错的选择)为此设置了 src/main/javasrc/test/java 等。

【讨论】:

    【解决方案2】:

    您可以将您的测试放在另一个地方的相同包名中。这被视为同一个包,您可以访问包私有类。测试类可以放在另一个 JAR 文件中,例如 testSomething.jar,而测试的包是 something.jar 的一部分。

    这不适用于密封包装。

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2017-07-21
      • 2020-03-18
      • 2016-06-27
      • 2016-12-18
      相关资源
      最近更新 更多