包和可见性



我正在制作一个SDK,我正在尝试将类分离到不同的包,这些类使用其他一些共享类。问题是,如果我将共享类公开,那么每个人都可以看到它们,而不仅仅是我的类。怎样才能使它们仅由我的应用程序访问?

的例子:


包一个MyClass1

方案bMyClass2

包c公共MySharedClass


因为c是公共MySharedClass将能够访问它,但问题是,它也将是可见的世界,我怎么能阻止它?

创建一个文档化的内部包,不被客户端使用。

在Java中没有办法使一个类只对某些包公开:它要么对所有包都是public,要么package-private(只在声明的包中公开)。

我认为有一个关于模块的建议可以更好地控制类的可见性,但我们至少要等到Java 8。

包在Java中都是"public"的,你能保护的是包中的类。要将一个类的可见性限制在给定的包中,可以这样声明(不带public可见性修饰符):

class MyClass {
    // ...
}

这样,只有与MyClass在同一个包中的类才能看到它

非平凡:

共享类可以由一组一般可访问的接口定义。实际的实现应该通过Classloader显式加载。之后,只需应用Java Security Management机制来控制对实现类的访问。任何人都可以看到接口,访问实际实现将仅限于您的SDK。

(以上是每个web/应用服务器需要做的事情。你认为Tomcat是如何阻止你访问其他应用程序的"公共"类的?

编辑:上面的注释是一个运行时机制。还有静态(后)编译方法。比如APT,在这里就很有效。当然,我不是在解决您的一揽子计划(OP)的重组问题,而只是解决如何确保获得一般方法的问题。但是这些有点"粗糙"——类加载的运行时机制是规范的,我认为严格来说更正确。

如果这个类是由两个不同包的类共享的,这可能是一个很好的指示,这两个类应该在同一个包中,以及共享的类,它不是公共的,因此只能由同一个包的类使用。

如果它确实不是一个选项,只需适当地记录共享类,以表明它不应该在SDK内部代码之外使用,它可能会在未来的版本中发生变化,并通过将包命名为"internal"或类似的东西来使它更清楚。

protected修饰符可以使用,以防你的类只能访问同一个包。否则就不可能了。

最新更新