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