Android模块访问修饰符 - 是否可能使方法仅在Android Studio库模块内可访问?

7

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

library中,我有一些包,例如managernetwork。 包manager包含一个名为SPManager的类,其中有一个静态方法storeSP()

package com.example.library.manager;

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

如何让storeSP()方法只在我的library模块中可访问?如果我选择包级私有(没有访问修饰符),那么我无法从同一模块中的network包中访问它。如果我选择公共访问修饰符,则该方法也可以从其他模块中访问。

提前感谢!


根据官方教程的说明,似乎不可能实现,但也许有我不知道的解决方法。这通常是为什么Java库将一些类放在名为“internal”的包中,以便库的使用者至少知道这些类中的API是内部的并且可能会更改。有趣的是,Kotlin添加了修饰符“internal”,它正好可以做到你想要的效果。 - Fred
正如我所猜测的那样,似乎有一些方法可以做到这一点。根据安德烈·瓦伦蒂在这个问题中的回答 https://dev59.com/Gmw15IYBdhLWcg3wZq1q 如果你使用的是Java 9,你可以使用jigsaw模块,或者使用不同的Maven模块来仅暴露公共API。 - Fred
3个回答

0

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

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

查看更多我的回答:


0

将您的方法的访问修饰符更改为protected,以便该方法的作用域仅限于包和扩展它的类内部。

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

1
谢谢,但那样我只能在同一个包中访问它。我想从模块内的每个包都可以访问它。 - Lukas Lechner
受保护的方法是只能被该类内部或继承自该类的类访问的方法。在这里,受保护的方法无法帮助你。不幸的是,我正在研究与 OP 相同的事情。在 C# 中,访问修饰符称为“internal”,不确定 Java 的等效物是什么。 - Glaucus

0

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

Kotlin有四个可见性修饰符:private、protected、internal和public。默认可见性为public。

  • 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
    
     protected class Nested {
         public val e: Int = 5
      }
    
    }
    
    class Subclass : Outer() {
     // a 不可见
     // b、c 和 d 可见
     // Nested 和 e 可见
    
     override val b = 5   // 'b' 是 protected
     }
    
    class Unrelated(o: Outer) {
     // o.a、o.b 不可见
     // o.c 和 o.d 可见(同一模块)
     // Outer.Nested 不可见,Nested::e 也不可见
     }
    

如需详细说明和代码示例,请访问此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接