【发布时间】:2023-03-08 07:14:01
【问题描述】:
根据Java 8 Language Spec §15.8.2(引用):
[...]
类字面量计算为由当前实例的类的定义类加载器 (§12.2) 定义的命名类型(或 void)的
Class对象。[...]
主要是,“Class 对象”暗示这是或应该是单例。 §12.2 还说:
[...]
行为良好的类加载器维护这些属性:
- 给定相同的名称,一个好的类加载器应该总是返回相同的类对象。
[...]
实际上,使用 Java 8*,以下**打印 true 和 true:
class Main {
public static void main(String[] args) {
Main main1 = new Main();
Main main2 = new Main();
System.out.println(main1.getClass().equals(main2.getClass()));
System.out.println(main1.getClass() == main2.getClass());
}
}
类加载器总是“表现良好”吗?为什么(不)?换句话说:Class 实例是单例吗?反过来:同一类型的Class 可以是不同的实例吗?
注意:我在这里没有提到单例模式。但是,如果Class 实现遵循该模式,那将会很有趣。作为一个次要步骤,但绝不是主要问题:因为单例模式的合法用途是争论的焦点,Java 的 Class 是否适合将单例模式应用于?
*:
$ java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.262-b10, mixed mode)
**:我的 IDE 甚至警告我打印的表达式总是true。
【问题讨论】:
标签: java class java-8 singleton jls