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获取更多资讯