2015-09-08 3 views
2

У меня возникла странная проблема.Ошибка компиляции в случае оператора switch с переменной ENUM и FINAL?

У меня есть статическая конечная переменная, объявленная, но не инициализированная. У меня есть частный метод xyz(), внутри которого у меня есть оператор Switch.

Но я делаю ставку на ошибку времени компиляции: «Конечное поле ABC не может быть назначено» - «Удалить последний модификатор ABC».

P.S. Ключ переключателя проверяет значение, возвращенное из ENUM

Просьба помочь мне.

Вот код: -

private static final String ABC; 
private void xyz(){ 
switch(ENUMImpl.getCountry()){   //** ENUMImpl is an ENUM class with a method getCountry() which returns the ENUM value 

case COUNTRY1: 
     ABC = "TMZ"; // The final field ABC cannot be assigned :: Remove final modifier of ABC 
     break; 
default: 
     ABC = "NA"; 
     break; 
    } 
} 
+2

Поля 'final' могут быть назначены напрямую или с помощью статического инициализатора. – Tunaki

ответ

2

Ваше поле static и final.

Это означает, что поле находится на уровне Class, а не на уровне экземпляра. И поле должно быть назначено один раз - в случае поля static его много назначить во время инициализации Class.

Там нет ничего, чтобы остановить вас делать:

public MyClass() { 
    xyz(); 
    xyz(); 
} 

т.е. вызова xyz дважды в конструкторе, так что он пытается присвоить ABC для каждого экземпляра. Это, очевидно, делает ABC не static final - и не является экземпляром final, поскольку он назначается дважды.

Что еще хуже, вы можете позвонить zyx() из произвольных методов экземпляра.

Вы должны убедиться, что ABC только каждый назначается один раз в Class инстанции, т.е. когда ClassLoader загружает class.

Вам нужно сделать что-то вроде:

private static String xyz(){ 
    switch(ENUMImpl.getCountry()) { 
     case COUNTRY1: 
      return "TMZ"; 
     default: 
      return "NA"; 
    } 
} 

static { 
    ABC = xyz(); 
} 

Примечание:

  1. Ваше форматирование очень некрасиво, пожалуйста, используйте автоформатирование в вашей IDE, прежде чем отправлять.
  2. ENUMImpl является ужасным имя ни для чего. Это, очевидно, enum, поскольку он объявлялся как таковой и это явно реализация, иначе он не существовал бы. Поэтому это абсолютно ничего не говорит о его назначении.
+0

Спасибо за быстрый ответ. – AnirbanDebnath

+0

Да, я только начал использовать stackoverflow; поэтому я буду учитывать все ваши предложения во время публикации в следующий раз. – AnirbanDebnath

+0

@anirbandebnath это предложения для вашего кодирования в целом. Если бы один из моих разработчиков придумал «ENUMImpl», им пришлось бы снова прочитать [Clean Code] (http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882), начиная с от корки до корки. –