Java и константы времени компиляции - PullRequest
2 голосов
/ 28 декабря 2011

Будет ли переменная static final типа примитива или String, которой присваивается значение при определении, рассматриваться компилятором Java как REAL константа времени компиляции?Получит ли такая переменная выигрыш в производительности, который есть у константы компиляции в других языках, например, C ++?

Перечисляются ли перечисления примитивов или String значений компилятором как константы?

FromНасколько я понимаю, всегда полезно заменять переменные константами , когда это не влияет на работу скрипта , и поэтому я удивляюсь пустому значению ключевого слова const в java.Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 28 декабря 2011

Да, они константы времени компиляции. Например, код

private static final boolean DEBUG = false;

...

if (DEBUG) {
   // some code
}

будет скомпилировано в байт-код, который даже не содержит код внутри if. Он будет удален компилятором.

И вам нужно перекомпилировать все классы, ссылающиеся на константу, если вы решите изменить ее значение.

Обратите внимание, что это только ссылка, которую нельзя изменить. Содержимое объекта (если оно изменчиво) может быть изменено. Например, содержимое массива или StringBuilder в следующем коде может быть изменено:

// don't do this:
public static final String[] seasons = new String[] {"Spring", "Summer", "Autumn", "Winter"};
public static final StringBuilder someBuffer = new StringBuilder("foo");

Ваш вопрос о перечислениях не имеет смысла. Нет перечисления примитива или STring. Каждое перечисление определяет свой собственный класс.

1 голос
/ 28 декабря 2011

Компилятор Java не сильно оптимизирует, но он выполняет оценку константных выражений конечных примитивов и некоторую общую оптимизацию для строк и перечислений. Хорошо это или нет - довольно субъективно. например Скажем, у вас есть постоянная в библиотеке

public static final int MY_CONST = 1;

это будет встроено. Однако, если вы попытаетесь изменить это либо в коде, либо во время выполнения, используя отражение, это не сработает, если вы не перекомпилируете все, что от него зависит. Учитывая, что большая часть Java имеет динамическое позднее связывание, об этом легко забыть и в некоторой степени нарушить динамическое связывание.

ИМХО, если бы они сегодня снова разработали компилятор, они бы не делали эту оптимизацию, они бы вместо этого позволили JIT.

0 голосов
/ 28 декабря 2011

Ключевое слово const не используется в Java. Он был зарезервирован как зарезервированное ключевое слово при создании языка, но не был реализован.

Перечисляет и предопределенные строковые значения, например, так:

String foo = "foo";

Считаются ли константы времени компиляции, они назначены и неизменны.

Подробнее о константах времени компиляции можно узнать в спецификации языка Java:

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

...