我试图切换一个名为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的抱怨,有没有一种优雅的方式来实现同样的目标?
答案 0 :(得分:1)
您可以通过将方法的目的分解为两部分来完成此任务:
将实例变量作为参数传递给方法将不起作用; 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,但此更改应该消除有关内部分配的警告,并且它应该使您的代码更清晰,更易于维护。