Согласно Java 8 Language Спецификация §15.8.2 (цитата):
[...]
Литерал класса оценивает объект
Class
для именованного типа (или для void), как определено определяющим загрузчиком класса (§12.2) класса текущего экземпляра.[...]
В основном «объект 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
.