Ответ 1
Ваш CONSTANT
не является постоянной времени компиляции, потому что JLS говорит, что это не так. Единственными типами, которые могут использоваться в постоянных выражениях, являются примитивные типы и String
.
Смысл этого в том, что экземпляр Object
(в общем случае) имеет семантически значимый идентификатор объекта, который отличает его от других экземпляров Object
. Этот идентификатор объекта не может быть закодирован в файле класса... или, по крайней мере, он не может быть закодирован с текущими форматами файлов классов. (И если бы это было возможно, возникли бы все другие проблемы...)
Значение null
может (теоретически) рассматриваться как частный случай, за исключением того, что нет большой точки. В частности, вы не можете использовать null
в любом из контекстов, где требуется "постоянная времени компиляции" (или выгодная) с лингвистической точки зрения. Например:
- Вы не можете иметь
null
как выражениеcase
. - Так как
==
для ссылочных типов не является постоянным выражением, вы не можете использовать его для идиомы "условной компиляции" Java с участиемif
с постоянным выражением как условие. (И кроме тогоnull == null
не является полезным условием...)
Что касается включения, в то время как "константа" не может быть встроена в байт-коды (из-за правил JLS о том, что такое "постоянное выражение" ), оптимизатор компилятора JIT будет разрешен для этого, и может на самом деле это... если есть ощутимые преимущества в производительности.
Ссылка: