Ответ 1
Модификатор final
находится в процессе подготовки к большей функции: значения типов, цель для Project Valhalla (функции для Java 10 +).
Вы можете прочитать все о типах значений для Java в статье 2014, приведенной ниже:
Типы значений для Java
Почему нам нужны типы значений в Java?
В Java объекты, созданные из ссылочных типов, имеют identity. Это позволяет ссылаться на конкретные объекты по переменным и сравнивать по ссылке. Все классы /enum/interfaces в настоящее время создают ссылочные типы. Таким образом, все объекты имеют идентификатор.
Но теоретически не все объекты требуют идентификатора, как это явно указано в документе 2014, приведенном выше:
Идентификация объекта служит только для поддержки изменчивости, где состояние объектов может быть мутировано, но остается одним и тем же внутренним объектом.
Тождества не являются бесплатными, а неизменяемым типам не требуется мутация, которая наследует означает, что они не требуют идентификаторов.
Идентичность неизменяемых типов приводит к чрезмерному охвату:
Идентификатор объекта имеет затраты на производительность и производительность, что является основной причиной того, что Java, в отличие от других объектно-ориентированных языков, имеет примитивы.
Внедрение типов значений
Джеймс Гослинг написал статью в 1999 году о компиляции неизменяемых типов типов в значения:
Практически возможно, в соответствии с текущим спецификацией языка, для достаточно умного оптимизирующего компилятора для преобразования определенных классов в легкие объекты, которые не являются выделенными кучами и передаются по значению, а не по ссылке: объявить класс и все его переменные экземпляра быть окончательными.
Эта идея была унаследована экспериментальным проектом Oracle Valhalla, возглавляемым Брайаном Гетцем. В процессе подготовки была создана спецификация для классов, основанных на значении, одно из требований - для класса final
.
В документе 2014 по типам значений в Java также раскрывается решение обеспечить соблюдение требования final
:
Могут ли значения участвовать в подтипировании на основе наследования? Нет.
Может ли класс значений быть абстрактным или не окончательным? Нет.
Решение ограничить или запретить подклассирование и подтипирование типов значений необходимо, чтобы избежать полиморфизма указателей.
Таким образом, мы можем гарантировать, что все методы решаются однозначно в точном типе приемника метода. Вызов метода значения всегда как invokestatic или invokespecial и никогда не нравится invokevirtual или invokeinterface.
Типы значений не могут участвовать в традиционном подтипировании (если это вообще было бы ограничено).
Итак, что это связано с Optional
?
Optional
- класс, основанный на значении.
В нем упоминалось, что классы, основанные на значении, могут выступать в качестве бокс-версии типов значений:
На самом деле, кажется вероятным, что бокс-форма каждого типа значений будет классом, основанным на значении.
Вложенная форма типа значения должна иметь те же атрибуты, что и типы значений (аналогичные Integer
для int
), которые включают предотвращение подтипов традиционных классов.