Я пытаюсь переключить логическое значение уровня класса toggle следующим образом:
public void myClass() {
private boolean toggle = false;
public void process(){
while (x < y) {
if (toggle()){
//do some stuff
} else {
//do some other stuff
}
}
}
private boolean toggle() {
return this.toggle = this.toggle ? false : true;
}
}
но SONAR жалуется на то, что return this.toggle = this.toggle ? false : true; говорит: «Следует избегать внутренних назначений». Если я реорганизую это, чтобы передать логическое значение уровня класса в метод toggle(), это не сработает и всегда вернет true. Есть ли элегантный способ добиться того же без жалоб со стороны SONAR?




Вы можете выполнить эту задачу, разделив цель метода на 2 части:
Передача переменной экземпляра в метод в качестве аргумента не сработает; метод получит копию значения; оригинал не изменится.
Более простой код лучше и читабельнее.
Я избегаю попыток смешивать тернарный оператор с присваиванием, потому что это будет пытаться сделать две вещи одновременно, и это может быть неясным, особенно без запоминания порядка приоритета между оператором присваивания (=) и тернарным оператором (?: ).
Кроме того, тернарный оператор не нужен; оператор отрицания ! переключит за вас логическое значение.
private boolean toggle() {
this.toggle = !this.toggle;
return this.toggle;
}
Если вы хотите использовать предыдущее значение логического значения, сначала сохраните его в локальной переменной, прежде чем изменять значение.
private boolean toggle() {
boolean prevToggle = this.toggle;
this.toggle = !this.toggle;
return prevToggle;
}
Хотя я не использовал SonarQube, это изменение должно устранить предупреждение о внутренних назначениях, а также сделать ваш код более понятным и легким в обслуживании.
спасибо за помощь, сейчас попробую ваши решения :-)