可见范围项目/模块

问题描述 投票:5回答:3

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

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

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

谢谢!

java c# android scope jvm
3个回答
0
投票

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

  • 是否包装相同;
  • 是否继承了这门课程。

导入库时,可以通过将自己的类放在具有相同名称的包中来访问任何非私有方法(或实际覆盖其中一个库类),因此即使限制对包的可见性,也无法阻止有人使用包可见的类/方法。

编辑

请注意,此答案适用于Java 8。

从Java 9开始,您可以使用模块系统,该系统可以更好地控制可以在哪里看到的内容。再一次,我对Android开发知之甚少(我在2010年对它进行了修改,但从那以后肯定已经发展了),所以我不知道这是否适用于这个问题。


2
投票

直到Java 9. Java 9模块系统解决了这个确切的问题。另一个答案提到Kotlin internal范围,但是a)OP没有要求Kotlin解决方案,并且b)我发现Kotlin internal范围与IntelliJ没有很好的兼容性,考虑到JetBrains创造了两者,这是具有讽刺意味的。


1
投票

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

有关Java和Kotlin中修饰符之间差异的详细说明,请参阅Fragmented podcast的episode #101 - “学习Kotlin - 可见性修饰符,内部修饰符,模块”以及official docs

© www.soinside.com 2019 - 2024. All rights reserved.