【问题标题】:Android Module access modifier - Is it possible to make a method only accessibile within an android studio library module?Android 模块访问修饰符 - 是否可以在 android studio 库模块中创建仅可访问的方法?
【发布时间】:2015-12-13 23:36:26
【问题描述】:

我有一个名为 app 的 Android Studio 模块。 我有另一个名为 library 的库模块。

library 中,我有一些包,例如 managernetworkmanager 包包含一个名为 SPManager 的类,该类具有静态方法 storeSP()

package com.example.library.manager;

public class SPManager {
    ______ static void storeSP(){...}
}

是否可以让 storeSP() 只能在我的 library 模块中访问?如果我选择包私有(无访问修饰符),我无法从同一模块中的 network 包中访问它。如果我选择public,那么这个方法也可以从其他模块访问。

提前致谢!

【问题讨论】:

  • 根据官方tutorial 看来这是不可能的,但也许有一个我不知道的解决方法。这通常是 Java 库将一些类放在名为 internal 的包中的原因,因此库的使用者至少知道这些类中的 API 是内部的并且可能会更改。奇怪的是,kotlin 添加了修饰符 internal,这正是你想要的。
  • 正如我所怀疑的,似乎有一些方法可以做到这一点。根据 Andre Valenti 在这个问题stackoverflow.com/questions/6642909/… 中的说法,如果您使用的是 Java 9,则可以使用拼图模块,或者使用不同的 Maven 模块仅公开公共 API。

标签: java android android-studio


【解决方案1】:

将方法的访问修饰符更改为protected,以便方法的范围保留在包和扩展它的类中。

public class Ex{
    protected void test()
    {
    }
}

【讨论】:

  • 谢谢,但我只能在同一个包中访问它。我想从模块内的每个包中访问它。
  • 受保护的方法是可以由该类内部访问的方法,或从该类继承的类。受保护的方法在这里对您没有帮助。不幸的是,我正在考虑做与 OP 相同的事情。 C# 中的访问修饰符称为“内部”,不知道 Java 的等价物是什么。
【解决方案2】:

简单的答案是,如果您使用修饰符public 标记您的方法,那么任何其他类都可以访问它。

如果您想让您的特定类/接口仅在该模块内可见/可访问,您可以考虑对这些类/接口应用混淆。混淆后,它们可以成为无意义的包名。通过这样做,您可以隐藏您的私人课程。

从我的答案中查看更多信息:

【讨论】:

    【解决方案3】:

    我也在寻找类似的东西,感谢@Fred 我已经实现了。 对于可能在 Kotlin 中寻找答案的人,请使用 internal 修饰符。

    Kotlin 中有四种可见性修饰符:private、protected、 内部和公共。默认可见性是公开的

    • private 表示仅在此类内部可见(包括其所有 成员)。

    • protected 与 private 相同,但在子类中也可见。

    • internal 表示该模块内的任何客户端看到 声明类看到它的内部成员。

    • public 表示任何看到声明类的客户端都会看到它的 公共成员。

       open class Outer {
      
       private val a = 1
       protected open val b = 2
       internal val c = 3
       val d = 4  // public by default
      
       protected class Nested {
           public val e: Int = 5
        }
      
      }
      
      class Subclass : Outer() {
       // a is not visible
       // b, c and d are visible
       // Nested and e are visible
      
       override val b = 5   // 'b' is protected
       }
      
      class Unrelated(o: Outer) {
       // o.a, o.b are not visible
       // o.c and o.d are visible (same module)
       // Outer.Nested is not visible, and Nested::e is not visible either
       }
      

    详细解释和代码示例请访问here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 2012-03-19
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多