JDK9之前没有基于包的依赖关系的访问控制规则

JDK9之前没有基于包的依赖关系的访问控制规则

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,给出一个恰当的访问控制范围。

Viewpoint #

From #

17 | 模块系统:为什么Java需要模块化?