Looking for java Keywords? Try Ask4Keywords

Java Language Константные выражения


пример

Постоянное выражение является выражением, которое дает примитивный тип или String, и значение которого может быть оценено во время компиляции до литерала. Выражение должно оцениваться без исключения исключения и должно состоять только из следующего:

  • Примитивные и строковые литералы.

  • Набирает типы для примитивных типов или String .

  • Следующие унарные операторы: + , - , ~ и ! ,

  • Следующие бинарные операторы: * , / , % , + , - , << , >> , >>> , < , <= , > , >= , == != , & , ^ , | , && и || ,

  • Тернарный условный оператор ? : .

  • Ориентированные на скобки выражения.

  • Простые имена, относящиеся к постоянным переменным. (Постоянная переменная - это переменная, объявленная как final где выражение инициализатора само является константным выражением.)

  • Квалифицированные имена формы <TypeName> . <Identifier> которые относятся к постоянным переменным.

Обратите внимание, что в приведенном выше списке исключаются ++ и -- , операторы присваивания, class и instanceof , вызовы методов и ссылки на общие переменные или поля.

Константные выражения типа String приводят к «интернированной» String , а операции с плавающей запятой в константных выражениях оцениваются с помощью FP-строгой семантики.

Использование для константных выражений

Константные выражения могут использоваться (примерно) в любом месте, где может использоваться нормальное выражение. Однако они имеют особое значение в следующих контекстах.

Для операторов case в операторах switch требуются константные выражения. Например:

switch (someValue) {
case 1 + 1:            // OK
case Math.min(2, 3):   // Error - not a constant expression
    doSomething();
}

Когда выражение в правой части присваивания является постоянным выражением, тогда назначение может выполнять примитивное сужение преобразования. Это разрешено при условии, что значение константного выражения находится в пределах диапазона типа с левой стороны. (См. JLS 5.1.3 и 5.2 ) Например:

byte b1 = 1 + 1;             // OK - primitive narrowing conversion.
byte b2 = 127 + 1;           // Error - out of range
byte b3 = b1 + 1;            // Error - not a constant expession
byte b4 = (byte) (b1 + 1);   // OK

Когда константное выражение используется как условие в do , while или for , то оно влияет на анализ читаемости. Например:

while (false) {
    doSomething();           // Error - statenent not reachable
}
boolean flag = false;
while (flag) {
    doSomething();           // OK
}

(Обратите внимание , что это не относится , if заявления. Компилятор Java позволяет then или else блок , if оператор будет недоступен. Это аналог Java условной компиляции в C и C ++.)

Наконец, static final поля в классе или интерфейсе с постоянными инициализаторами выражения инициализируются с нетерпением. Таким образом, гарантируется, что эти константы будут наблюдаться в инициализированном состоянии, даже если в графике зависимостей инициализации класса есть цикл.

Для получения дополнительной информации см. JLS 15.28. Константные выражения .