Ошибка сонара - следует избегать внутренних назначений

Я пытаюсь переключить логическое значение уровня класса 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
493
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете выполнить эту задачу, разделив цель метода на 2 части:

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

спасибо за помощь, сейчас попробую ваши решения :-)

Orby 11.04.2018 19:25

Другие вопросы по теме