В 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 - ... если вы не сгенерировали исходный код и не скомпилировали его во время выполнения. Вам следует избегать подобных сложностей, если только это не оправдано.