【问题标题】:Sonar Error - Inner assignments should be avoided声纳错误 - 应避免内部分配
【发布时间】:2018-04-12 01:02:17
【问题描述】:

我正在尝试像这样切换名为 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 抱怨的情况下达到同样的效果?

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

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

    1. 切换布尔值。
    2. 返回新结果。

    将实例变量作为参数传递给方法是行不通的; 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,但此更改应该消除有关内部分配的警告,并且应该使您的代码更清晰,更易于维护。

    【讨论】:

    • 感谢您的帮助,我现在就试试您的解决方案 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多