Инструкция Switch Case Использование переменной уровня класса - PullRequest
0 голосов
/ 28 марта 2020

Как я могу использовать оператор переключения регистра, используя переменную уровня класса.

@Value("${user.name}")
private static final String userName = "xyz";

public static void main(String[] args) {
  String nn = "xyz";
  switch (nn) {
    case userName:
        System.out.println("It Works!!");

  }
}

В приведенном выше примере у меня есть переменная уровня класса с именем "userName", которая получает значение из файла свойств. Чтобы использовать это поле в операторе переключателя case, я должен сделать его окончательным и присвоить значение, но оно не выполняет оператор case. Как я могу использовать переменную уровня класса в операторе switch case?

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Он не выполнит ваш оператор case, потому что значение вашей переменной-переключателя nn равно "abcd", в то время как внутри вашей переменной-регистра userName ее "xyz" она ищет "abcd" case.

0 голосов
/ 28 марта 2020

В case userName: выражение (userName) должно быть (время компиляции) константное выражение .

Если userName объявлено так:

private static final String userName = "xyz";

, то userName является константным выражением (время компиляции).

Но если переменная String такие как userName not final, или если он имеет пустой инициализатор, или если он инициализируется в результате вызова метода ... или нескольких других вещей ... тогда это не (время компиляции) константное выражение.

Прочитайте JLS 15,28 для полного набора критериев для константного выражения.


Так как мне решить мою проблему? Я пытаюсь решить проблему сонара "Когнитивная сложность", когда я запускаю для l oop список объектов и задаю новую переменную объекта на основе элементов для l oop объекта. Я не хочу использовать оператор if else, и поэтому пытался переключать оператор case, пока не столкнулся с этой проблемой.

Теперь мы подходим к проблеме real !!

Вам нужно что-то более простое, чем цепочки if / else, но все еще работающее, когда строки (например, слова) являются динамическими c. Операторы Switch не будут работать 1 .

Вот одна идея:

private static HashMap<String, Something> map = new HashMap<>();
// populate map for each word.

// then
String word = ...
Something something = map.get(word);
if (something) {
    // use it.
}

Something может быть пользовательским объектом или типом функционального объекта .... так что вы можете заполнить карту лямбдами.

Этот подход более многословный, чем (гипотетическая) строка switch, но производительность должна быть примерно одинаковой. Будет ли он более читабельным, будет зависеть от контекста и того, кто читает код.

С другой стороны, было бы более уместно просто игнорировать предупреждение сонара. Сонар дает вам совет по качеству кода на основе довольно грубой эвристики. Он не понимает код и не понимает, как думают люди (программисты).


1 - ... если вы не сгенерировали исходный код и не скомпилировали его во время выполнения. Вам следует избегать подобных сложностей, если только это не оправдано.

...