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