可视范围项目/模块

我有两个在Android Studio中链接的项目/模块。 其中一个作为一个Api /核心,我需要某些类只能从这个模块访问,但从所有的包(所以“默认”在这种情况下是无用的)访问。

但似乎在Java中它不是像内部(C#,SWIFT)的修饰符。 “模块”修改器是为Java 7提出的,但没有实现。

那么,是否有任何方法可以保护模块的类别不受外界影响,而不会将其范围限制在当前的包中?

谢谢!

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

  • 同样的包装与否;
  • 是否继承这个类。

当你导入一个库时,你可以通过把自己的类放入一个同名的包中来访问任何非私有的方法(或者实际上覆盖其中一个库类),所以即使限制了对包的可见性,也不能阻止有人从使用包可见的类/方法。

在jdk中没有这样的访问修饰符,但是kotlin带有internal修饰符,这正是你想要的:类在模块中变成公共的,但是不能在模块之外访问。

有关Java和Kotlin中修饰符之间差异的详细解释,请参阅分段播客的第101集 – “学习Kotlin – 可见性修饰符,内部修饰符,模块”以及官方文档 。

直到Java 9. Java 9模块系统解决了这个确切的问题。 另一个答案提到Kotlin的internal范围,但是a)OP没有要求Kotlin解决方案,并且b)我发现Kotlin的internal范围与IntelliJ不兼容,因为JetBrains创造了两个。