我正在收到警告"布尔方法总是反转的"在IntelliJ中运行lint。我的代码库中有几个类似的警告。哪种基本的编码风格,我错过了吗?
public static boolean isBlueToothEnabled(){
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter != null)
return bluetoothAdapter.isEnabled();
return false;
}
答案 0 :(得分:19)
如果false
为null,请尝试返回bluetoothAdapter
,否则返回isEnabled()
的输出
public static boolean isBlueToothEnabled(){
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter == null){
return false;
}
return bluetoothAdapter.isEnabled();
}
了解更多:
在“清洁法典”中,罗伯特·马丁写道,“否定者只是有点困难 理解而不是积极的。因此,在可能的情况下,条件应该 表达为积极的。“(Martin,[G29])。 IntelliJ IDEA有三个 检查,以帮助您保持积极。
https://blog.jetbrains.com/idea/2014/09/the-inspection-connection-issue-2/ (条目#4避免负面条件)
https://www.jetbrains.com/help/idea/2016.1/invert-boolean.html
答案 1 :(得分:8)
节省时间:总是否定布尔方法调用。没什么好担心的。
为什么会发生
如果我们有方法foo()
boolean foo()
{
if(condition == true)
return true;
else
return false;
}
仅被称为!foo()
,
class A
{
if(!foo())
do something;
...
if(!foo())
do something else;
}
因为我们只拨打!foo()
并且没有拨打foo()
。
警告要求我们以积极的方式使用foo()
。
删除警告
通过反转方法foo()的返回值,
boolean foo()
{
if(condition == true)
return **false**;
else
return **true**;
}
现在调用方法
class A
{
if(foo())
do the same thing;
}
答案 2 :(得分:0)
为简化起见,请参见以下代码:
public boolean isBoy(int sex){ return sex == boy};
if(!isBoy(sex)){ // todo}
If do so, it called inverted. How to solve? see the other code below:
public boolean isGirl(int sex){ return sex == girl};
if(isGirl(sex)){ // todo}
因为您需要判断条件是否是女孩,所以应避免判断是否是男孩,并加一个“!”。
答案 3 :(得分:0)
我必须说,在某些情况下,我认为此警告甚至无法以合理的方式解决。以如下代码为例:
boolean getInfo(Info info) {
// Retrieve some info that can fail so the function returns true or false
}
void func() {
Info info;
if (!getInfo(info)) {
// Failed; handle error, early out
return;
}
// Do stuff
if (!getInfo(info)) {
// Failed; handle error, early out
return;
}
// Do stuff
if (!getInfo(info)) {
// Failed; handle error, early out
return;
}
// Do final calculations
}
在这种情况下该怎么办?将函数重命名为notGetInfo()
吗? getDesinformation()
?难道不是因为出现故障而过早退出功能,导致括号树不断增长?