【问题标题】:Visibility scope project/module可见性范围项目/模块
【发布时间】:2015-02-27 12:25:45
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: java c# android scope jvm


    【解决方案1】:

    jdk 中没有这样的访问修饰符,但 kotlin 带有 internal 修饰符,它完全符合您的要求:类在模块内变为公共,但在模块外不可访问。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        • 是否相同;
        • 继承与否。

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

        编辑

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

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

        【讨论】:

        • 太糟糕了。如果您需要保护它们免受外部世界的影响,这可以防止在包中组织您的类。
        • 确实如此。外界一定不能使用的,一定是私有的。正如我所说,对于所有其余的,在您的项目中创建相同的包就足够了,您将能够覆盖。这实际上对我有用。我被 Spring 3.2.* 困住了,需要一个 Spring 4.1.* 类来与另一个库兼容,所以我只是将我需要的类复制到了正确的包中,然后诀窍就完成了。现在的问题是确定你真正需要对这个世界隐藏什么,以及什么是有用的,但你最了解这一点。
        • 正是这样的事情使 Java 成为了一种笨拙的鼠标语言。在 C# 中,您可以使用“内部”访问修饰符。
        • 正如other answers 中提到的,我的回答不再正确,因为模块系统解决了这个问题。不过,我又不熟悉Android开发,不知道模块能不能用。
        猜你喜欢
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        • 2014-04-05
        • 2019-03-02
        • 1970-01-01
        • 2012-05-10
        相关资源
        最近更新 更多