Недавно я наткнулся на класс, в котором было объявлено следующее поле:
private final int period = 1000;
В данном конкретном случае автор намеревался сделать его статичным, поскольку значение нельзя было изменить прив любом случае, не было реальной функциональной причины не объявлять его статическим, но меня удивило, как Java обрабатывает финальные и конечные статические примитивы.
В частности:
1) Как хранятся конечные статические примитивы?Просто ли они скомпилированы непосредственно в выражения, в которых они используются?
2) Если они фактически являются выделенным хранилищем, должен ли каждый экземпляр содержащего класса поддерживать ссылку на это местоположение?(в этом случае для примитивов размером менее 4 байтов каждый экземпляр класса будет на самом деле больше, чем если бы он просто включал примитив напрямую, как это было бы в нестатическом случае)
3) Являются ли компиляторытеперь достаточно умен, чтобы определить, что в случаях, подобных приведенному выше, переменная «эффективно статична», так как было бы невозможно, чтобы разные экземпляры содержали разные значения и, следовательно, оптимизировали ее аналогично окончательному статическому?