Java Заменить / улучшить нулевую проверку - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть псевдо Java метод, где все может быть обнуляемо:

private String prepareMessage(Scope scope) {
    if (scope != null) {
        if (scope.getPermission != null) {
            if (scope.getInfo != null) {
                return "Successful";
            } else {
                return "Missing field Info";
            }
        } else if (scope.getInfo() != null) {
            return "Permission field not provided";
        }
    }
    return "Permission and Info fields not provided";
}

Как я могу упростить этот код, чтобы удалить ужасно выглядящие нулевые проверки? Спасибо!

Ответы [ 3 ]

3 голосов
/ 03 февраля 2020

Вы можете создать вспомогательный метод, который вам подходит, например:

public String notNullOrElse(Object o, String notNull, String isNull) {
    return null != o ? notNull : isNull;
}

Затем вы можете изменить:

if (scope.getInfo != null) {
    return "Successful";
} else {
    return "Missing field Info";
}

на:

return notNullOrElse(scope.getInfo(), "Successfull", "Missing field Info");

Однако иногда эти ужасные нулевые проверки , к сожалению, необходимы.

1 голос
/ 03 февраля 2020

Пробовал рефакторинг кода. В большинстве случаев вы можете упростить If - else, переупорядочив поток кода. Это облегчает получение покрытия кода.

private String prepareMessage(Scope scope) {
    if (scope == null) {
        return "Permission and Info fields not provided";
    }

    if (scope.getPermission != null && scope.getInfo != null) {
        return "Successful";
    } else {
        return scope.getPermission == null ? "Permission field not provided" : "Missing field Info";
    }

}

Это c прекрасно объясняет запах кода в if-else -> https://dzone.com/articles/code-smells-if-statements

0 голосов
/ 03 февраля 2020

Java 1.7 представляет класс java.util.Objects ( эта ссылка взята из Java 11 JavaDo c, но здесь это не имеет значения).

Этот класс предоставляет методы Objects.isNull() и Objects.nonNull(), которые могут использоваться в вашем коде следующим образом:

import static java.util.Objects.*;
…
private String prepareMessage(Scope scope) {
    if (nonNull (scope)) {
        if (nonNull (scope.getPermission())) {
            if (nonNull (scope.getInfo())) {
                return "Successful";
            } else {
                return "Missing field Info";
            }
        } else if (nonNull (scope.getInfo()) {
            return "Permission field not provided";
        }
    }
    return "Permission and Info fields not provided";
}

Конечно, выглядит это лучше или нет, это вопрос вкуса.

Альтернативные логики c могут выглядеть так (для Java 11):

import static java.util.Objects.*;
…
private String prepareMessage( Scope scope ) 
{
    var messages = { "Successful", "Missing field Info", "Permission field not provided", "Permission and Info field not provided" };
    var index = 0;
    var retValue = messages [3]; // No scope at all

    if( nonNull( scope ) ) 
    {
        if( isNull( scope.getPermission() ) ) index += 2;
        if( isNull( scope.getInfo() ) ) index += 1;
        retValue = messages [index];
    }
    return retValue;
}

Я не хочу сказать, что это действительно лучше, в любом случае, это просто другое. И это избавляет от одной нулевой проверки ...

...