IntelliJ IDEA: логический метод XX всегда инвертирован
Я получаю предупреждение "Булевский метод всегда инвертирован" при запуске lint в IntelliJ. У меня есть несколько подобных предупреждений в моей кодовой базе. Какой основной стиль кодирования, я не хватает?
public static boolean isBlueToothEnabled(){
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter != null)
return bluetoothAdapter.isEnabled();
return false;
}
Ответы
Ответ 1
попытайтесь вернуть false
, если bluetoothAdapter
равно null, иначе верните вывод isEnabled()
public static boolean isBlueToothEnabled(){
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(bluetoothAdapter == null){
return false;
}
return bluetoothAdapter.isEnabled();
}
Подробнее:
В "Чистом коде" Роберт Мартин пишет: "Негативы немного сложнее чтобы понять, чем положительные. Поэтому, когда это возможно, условные обозначения должны выражаться в позитивах" (Мартин, [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
Ответ 2
Экономия времени: всегда проверяйте НЕ вызова логического метода. Не используя результат напрямую. Не беспокойтесь и возвращайтесь к разработке.
Почему это происходит
Если у нас есть метод 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;
}
Ответ 3
Для упрощения см. Код ниже:
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}
Потому что вам нужно судить о том, является ли девочка девочкой, поэтому вам следует избегать суждения о том, является ли мальчик мальчиком, и поставить "!".