声纳错误 - 应避免内部任务

时间:2018-04-11 16:48:56

标签: java sonarqube

我试图切换一个名为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;说&#34;应该避免内部任务。&#34;如果我重构这个以将类级布尔值传递给toggle()方法它不起作用并且总是返回true。如果没有SONAR的抱怨,有没有一种优雅的方式来实现同样的目标?

1 个答案:

答案 0 :(得分:1)

您可以通过将方法的目的分解为两部分来完成此任务:

  1. 切换布尔值。
  2. 返回新结果。
  3. 将实例变量作为参数传递给方法将不起作用; the method will get a copy of the value; the original won't change

    更简单的代码更好,更易读。

    我避免尝试将三元运算符与赋值混合,因为这会尝试一次做两件事,并且可能不清楚,特别是没有记住赋值运算符(=)和三元运算符之间的优先顺序(?:)。

    此外,三元运算符是不必要的;否定运算符!将为您切换一个布尔值。

    private boolean toggle() {
        this.toggle = !this.toggle;
        return this.toggle;
    }
    

    如果您碰巧想使用布尔值的前一个值,请在更改值之前先将其存储到局部变量中。

    private boolean toggle() {
        boolean prevToggle = this.toggle;
        this.toggle = !this.toggle;
        return prevToggle;
    }
    

    虽然我没有使用SonarQube,但此更改应该消除有关内部分配的警告,并且它应该使您的代码更清晰,更易于维护。