Существует различие в уровне байт-кода:
Исходный код:
final int value;
public TestBox() {
value = 7;
}
Создает следующий код из addPropertyChangeListener
:
0: getstatic #3;
3: aload_0
4: getfield #2;
7: invokevirtual #4;
И исходный код:
final int value = 7;
public TestBox() {
}
Создает следующий код из addPropertyChangeListener
:
0: getstatic #3;
3: bipush 7
5: invokevirtual #4;
Так что есть небольшая разница. Но не практично.
Кажется, что компилятор может обрабатывать конечную переменную как константу, если она инициализирована в операторе определения. Разные компиляторы могут делать это по-разному.