Content #
JDK 9 之前的 Java 语言没有描述和定义包之间的依赖关系,也没有描述和定义基于包的依赖关系的访问控制规则。 这是一个缺失的访问控制。
比如 public 修饰的 Socket 类。
package java.net;
public class Socket implements java.io.Closeable {
// snipped
}
用来实现公开接口 Socket 类的 PlatformSocketImpl 类,就是一个使用 public 修饰的类。
package sun.net;
public interface PlatformSocketImpl {
// snipped
}
Socket 类和 PlatformSocketImpl 类就位于不同的 Java 包。
虽然 PlatformSocketImpl 是一个 public 修饰的类,但是我们并不期望所有的开发者都能够使用它。这是一个用来支持公开接口 Socket 实现的类。除了实现公开接口 Socket 的代码之外,它不应该被任何其他的代码和开发者调用。然而, PlatformSocketImpl 是一个 public 修饰的类。这也就意味着任何代码和开发者都可以使用它。这显然是不符合设计者的预期的。
在 JDK 8 及以前的版本里,一个对象在两个包之间的访问控制,要么是全封闭的,要么是全开放的。所以,JDK 9 之前的 Java 世界里,它的设计者没有办法强制性地设定 PlatformSocketImpl,给出一个恰当的访问控制范围。