Эта магическая точка наносит 10 000 единиц урона...

Spring Boot Java

1. Введение

При рефакторинге старого кода я столкнулся с большим количеством надписей, подобных следующему:

    public void attend(String value) {
        if ("0".equals(value)) {
            //todo 
        } else if ("1".equals(value)) {
            //todo
        } else {
            //todo 
        }
    }

Череп болит! отJavaГрамматически безупречно, но с деловой точки зрения непонятно0а также1то есть они вместе именуютсямагическое значение. Для приведенного выше кода нам часто нужно выводить логику из контекста, если это очень сложный бизнес или код 10-летней давности, то будет еще хуже, а документации нет. Для удобочитаемости мы стараемся избегать магических значений. Сегодня я расскажу о нескольких операциях, позволяющих избежать магического значения.

2. Избегайте манипулирования магическим значением.

Общее магическое значение меняется не часто. Обработка магических значений должна сочетаться с делом и масштабом.

2.1 Статические константы

Если область значения находится в классе или в том же пакете, это обычно можно решить с помощью статической константы.

    private static final String FEMALE = "0";
    private static final String MALE = "1";
    public void attend(String value) {
        if (FEMALE.equals(value)) {
            //todo
        } else if (MALE.equals(value)) {
            //todo
        } else {
            //todo
        }
    }

Разве это не намного яснее?0а также1Представляет пол (конечно, он должен соответствовать вашим хорошим привычкам именования переменных).

2.2 Использование интерфейса

Поскольку мы используем статические константы, прекрасно, что мы можем инкапсулировать магическое значение в интерфейс.

public interface Gender {
    String FEMALE = "0";
    String MALE = "1";
}

2.3 Использование перечислений

Но смысл интерфейса в том, чтобы предоставлять абстрактные функции вместо хранения каких-то постоянных значений, что явно идет вразрез с первоначальным замыслом дизайна интерфейса. такjdk1.5Введены типы перечисленийenum.

public enum GenderEnum {
    FEMALE,
    MALE
}

Во многих случаях этого достаточно, и вы можете пройтиGenderEnum.MALE.ordinal()Получите числовой порядковый номер соответствующего перечисления, или вы можете пройтиGenderEnum.MALE.name()Получить строковое имя соответствующего перечисления. В большинстве случаев их можно использовать для некоторой логической идентификации. Но это не может удовлетворить наш первоначальный дизайн выше, нам нужно преобразовать конструктор класса перечисления.

public enum GenderEnum {

    FEMALE("0"),
    MALE("1");

    private final String value;

    GenderEnum(String value) {
        this.value = value;

    }

    public String value() {
        return this.value;
    }
}

Переписав это, мы можем пройтиvalue()способ получения определенного значения.

Мы добавляем немного больше требований к себе, чтобы сделать ваши перечисления более удобными для чтения.

public enum GenderEnum {

    UNKNOWN("-1", "未知"),
    FEMALE("0", "女性"),
    MALE("1", "男性");

    private final String value;
    private final String description;

    GenderEnum(String value, String description) {
        this.value = value;
        this.description = description;
    }

    public String value() {
        return this.value;
    }

    public String description() {
        return this.description;
    }
}

descriptionЗначение может не только помочь нам узнать фактическое значение перечисления, но даже вернуть его интерфейсному бизнесу в виде описания.

Советы: старайтесь не использовать китайские объявления для перечислений, напримерFEMALEпрямо заявлено какженский. Также перечисления являются синглтонами, поэтому нельзя использовать клонирование и десериализацию.

3. Резюме

Сегодня мы увидели, как изящно обрабатывать магические значения в кодировании, особенно в схемах перечисления. Я надеюсь полезно для вас.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn