我在Android Studio中链接了两个项目/模块。其中一个充当API/核心,我需要某些类只能从该模块访问,但可以从其所有包访问(因此在这种情况下“默认”是无用的)。但在Java中,它似乎不是像internal(c#,swift)那样的修饰符。“Module”修饰符是在Java 7中提出的,但没有实现。那么,有没有什么方法可以保护模块的类不受外部世界的影响,而又不将它们的范围限制在当前包中呢?谢谢!
xfb7svmp1#
在JDK中没有这样的访问修饰符,但是Kotlin附带了internal修饰符,它正好做了你想要的:类在模块内变为公共的,但在模块外不可访问。有关Java和Kotlin中修饰符之间差异的详细解释,请参阅Fragmented podcast的episode #101- “Learning Kotlin - visibility modifier,internal modifier,modules” 以及official docs。
internal
i7uq4tfw2#
Java 9模块系统解决了这个问题。另一个答案提到了Kotlininternal作用域,但a)OP没有要求Kotlin解决方案,b)我发现Kotlin internal作用域不能很好地与IntelliJ配合使用,考虑到JetBrains创建了这两个作用域,这是具有讽刺意味的。
h9vpoimq3#
我不确定在Android的情况下,但在标准Java中,答案是否定的:整个可见性仅基于两个参数:
当你导入一个库时,你可以通过把你自己的类放到一个同名的包中来访问任何非私有方法(或者实际上覆盖一个库类),所以即使你限制了包的可见性,你也不能阻止别人使用包可见的类/方法。
请注意,此答案适用于Java 8之前的版本。从Java 9开始,你可以使用一个模块系统,它提供了更多的控制,可以在哪里看到什么。再一次,我不知道很多关于Android的开发(我在2010年修补了它,但肯定是从那时起演变),所以我不知道这是否适用于这个问题的上下文。
tmb3ates4#
在Android annotations lib中,有一个名为RestrictTo的注解可能会有所帮助,尽管它不会隐藏您的方法,但如果有人试图在您的模块之外的其他地方使用它,它至少会让Android Studio抱怨。值得注意的是,据我所见,如果在Java类内部调用上述方法,Android Studio会发出抱怨。不幸的是,如果您在那里做同样的事情,Kotlin似乎不会发出抱怨,因此这种替代方法似乎不适用于跨语言。
4条答案
按热度按时间xfb7svmp1#
在JDK中没有这样的访问修饰符,但是Kotlin附带了
internal
修饰符,它正好做了你想要的:类在模块内变为公共的,但在模块外不可访问。有关Java和Kotlin中修饰符之间差异的详细解释,请参阅Fragmented podcast的episode #101- “Learning Kotlin - visibility modifier,internal modifier,modules” 以及official docs。
i7uq4tfw2#
Java 9模块系统解决了这个问题。另一个答案提到了Kotlin
internal
作用域,但a)OP没有要求Kotlin解决方案,b)我发现Kotlininternal
作用域不能很好地与IntelliJ配合使用,考虑到JetBrains创建了这两个作用域,这是具有讽刺意味的。h9vpoimq3#
我不确定在Android的情况下,但在标准Java中,答案是否定的:整个可见性仅基于两个参数:
当你导入一个库时,你可以通过把你自己的类放到一个同名的包中来访问任何非私有方法(或者实际上覆盖一个库类),所以即使你限制了包的可见性,你也不能阻止别人使用包可见的类/方法。
请注意,此答案适用于Java 8之前的版本。
从Java 9开始,你可以使用一个模块系统,它提供了更多的控制,可以在哪里看到什么。再一次,我不知道很多关于Android的开发(我在2010年修补了它,但肯定是从那时起演变),所以我不知道这是否适用于这个问题的上下文。
tmb3ates4#
在Android annotations lib中,有一个名为RestrictTo的注解可能会有所帮助,尽管它不会隐藏您的方法,但如果有人试图在您的模块之外的其他地方使用它,它至少会让Android Studio抱怨。
值得注意的是,据我所见,如果在Java类内部调用上述方法,Android Studio会发出抱怨。不幸的是,如果您在那里做同样的事情,Kotlin似乎不会发出抱怨,因此这种替代方法似乎不适用于跨语言。