可见范围 project/module

Visibility scope project/module

我在 Android Studio 中链接了两个 projects/modules。其中一个充当 Api/Core,我需要某些 类 只能从该模块访问,但可以从其所有包访问(因此在这种情况下“默认”是无用的)。

但是在Java中好像不是internal(c#,swift)那样的修饰符。 Java 7 提出了“模块”修饰符,但没有实现。

那么,有什么方法可以保护模块的 类 不受外界影响,而不会将其范围限制在当前包内吗?

谢谢!

我不确定 Android 的情况,但在标准 Java 中,答案是否定的:整个可见性仅基于两个参数:

  • 是否同包;
  • 是否继承class。

导入库时,您可以通过将自己的 class 放入同名包中来访问任何非私有方法(或实际上覆盖其中一个库 classes) , 所以即使你限制了一个包的可见性,你也不能阻止别人使用包可见 classes/methods.

编辑

请注意此答案适用于 Java 8.

从 Java9 开始,您可以使用模块系统,它可以更好地控制在何处可以看到什么。再一次,我对 Android 的发展知之甚少(我在 2010 年对它进行了修补,但从那以后肯定有所发展),所以我不知道这是否适用于这个问题的上下文.

jdk 中没有这样的访问修饰符,但 kotlin 带有 internal 修饰符,它正是你想要的:class 变成 public模块,但在模块外部不可访问。

有关 Java 和 Kotlin 中修饰符之间差异的详细解释,请参阅 Fragmented podcast 的 episode #101 - "Learning Kotlin – visibility modifiers, internal modifier, modules", as well as the official docs

直到 Java 9。 Java 9 模块系统解决了这个问题。另一个答案提到了 Kotlin internal 范围,但是 a) OP 没有要求 Kotlin 解决方案,并且 b) 我发现 Kotlin internal 范围不能很好地与 IntelliJ 配合使用,考虑到这一点具有讽刺意味JetBrains 创建了两者。