Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可见性范围项目/模块_Java_C#_Android_Scope_Jvm - Fatal编程技术网

Java 可见性范围项目/模块

Java 可见性范围项目/模块,java,c#,android,scope,jvm,Java,C#,Android,Scope,Jvm,我在Android Studio中链接了两个项目/模块。其中一个充当Api/核心,我需要某些类只能从该模块访问,但可以从其所有包访问(因此在本例中“默认”是无用的) 但在Java中,它似乎不像internal(c#,swift)那样是一个修饰符。“Module”修饰符是为Java7提出的,但没有实现 那么,是否有任何方法可以保护模块的类不受外部世界的影响,而不将其范围限制在当前包中 谢谢 我不确定Android的情况,但在标准Java中,答案是否定的:整个可见性仅基于两个参数: 包装是否相同

我在Android Studio中链接了两个项目/模块。其中一个充当Api/核心,我需要某些类只能从该模块访问,但可以从其所有包访问(因此在本例中“默认”是无用的)

但在Java中,它似乎不像internal(c#,swift)那样是一个修饰符。“Module”修饰符是为Java7提出的,但没有实现

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


谢谢

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

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

编辑

请注意,这个答案一直适用于Java8


在Java9中,您可以使用一个模块系统,它提供了对在何处可以看到的内容的更多控制。再一次,我对Android开发不太了解(我在2010年就对它进行了修补,但从那时起它肯定已经发展了),所以我不知道这是否适用于这个问题。

jdk中没有这样的访问修饰符,但kotlin提供了
内部
修饰符,这正是您想要的:类在模块内成为公共的,但在模块外是不可访问的


有关Java和Kotlin中修饰符之间差异的详细解释,请参阅片段播客-“学习Kotlin–可见性修饰符、内部修饰符、模块”,以及.

直到Java 9。Java9模块系统正好解决了这个问题。另一个答案提到了Kotlin
内部
范围,但a)OP没有要求Kotlin解决方案,b)我发现Kotlin
内部
范围与IntelliJ的关系不好,考虑到JetBrains同时创建了两者,这很讽刺。

太糟糕了。如果您需要保护类不受外部世界的影响,这将阻止您在包中组织类。外部世界不能使用的东西必须是私人的。正如我所说的,对于所有其他内容,在您的项目中创建相同的包就足够了,您将能够覆盖它。事实上,这对我很有用。我坚持使用Spring3.2.*并且需要一个Spring4.1.*类来与另一个库兼容,所以我只是将我需要的类复制到正确的包中,技巧就完成了。现在的问题是确定你到底需要向世界隐瞒什么,以及什么是有用的,但你最有可能知道这一点。正是这样的事情让Java成为了一种米老鼠语言。在C#中,您可以使用“内部”访问修饰符。如中所述,我的答案不再正确,因为模块系统解决了这个问题。不过,我还是不熟悉Android开发,也不知道这些模块是否可以使用。