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}

Потому что вам нужно судить о том, является ли девочка девочкой, поэтому вам следует избегать суждения о том, является ли мальчик мальчиком, и поставить "!".