2016-01-18 1 views
0

Я сделал сумасшедшее открытие сегодня на Java, и я хотел бы знать, почему.Почему не все конечные константные строки создаются равными в java

Следующая инструкция Переключатель работы

public static final String OTHER_OTHER = ”.otherOther”; 
… 
     switch (SWITCHER) { 
      case Dogs.OTHER_OTHER: 
       doMyWork(intent); 
       break; 
      default: 
       ...; 
     } 

Не удается скомпилировать

public static final String OTHER_OTHER = Dogs.class.getPackage().toString()+”.otherOther”; 
… 
     switch (SWITCHER) { 
      case Dogs.OTHER_OTHER: 
       doMyWork(intent); 
       break; 
      default: 
       ...; 
     } 

Единственное различие между этими двумя отрывками в том, как я построил постоянную OTHER_OTHER

второй оператор switch заявляет, что OTHER_OT ЕЕ не является константой. Я создаю строку всего, используя final.

+0

Является ли OTHER_OTHER одинаковым для обоих значений. –

+0

У меня вопрос не возникает. Я создаю String, используя 'final String', что не делает его константой? –

+0

Что означает «не работает»? Не компилируется? Производит неожиданный результат? –

ответ

3

Dogs.class.getPackage().toString() не является константой, он использует API отражения для извлечения пакета во время выполнения через загрузчик классов. Таким образом, эти примеры не эквивалентны.

+0

Вы можете добавить, что постоянные значения должны быть разрешимы во время компиляции, а выражение в нерабочей версии не может быть известно до выполнения. –

+0

Ну, это «постоянный» во время выполнения. но это не постоянное выражение времени компиляции. – Thilo

+0

@JimGarrison Я считаю, что правильнее сказать, что выражение считается постоянным, если оно может быть разрешено во время компиляции. – Kiskae