Я видел, как предлагалось в блоге, что следующее был разумным способом выполнить «обратный поиск» с использованием getCode(int)
в перечислении Java:
public enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private static final Map<Integer,Status> lookup
= new HashMap<Integer,Status>();
static {
for(Status s : EnumSet.allOf(Status.class))
lookup.put(s.getCode(), s);
}
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
public static Status get(int code) {
return lookup.get(code);
}
}
Для меня статическая карта и статический инициализатор кажутся плохой идеей, и моей первой мыслью было бы закодировать поиск следующим образом:
public enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
public static Status get(int code) {
for(Status s : values()) {
if(s.code == code) return s;
}
return null;
}
}
Есть ли какие-либо очевидные проблемы с любым из этих методов и есть ли рекомендуемый способ реализации такого поиска?
for(Status s : values()) lookup.put(s.code, s);
- person Peter Lawrey   schedule 15.03.2011Enum.valueOf()
? Вы не можете хранить строки? - person Jonathan   schedule 15.03.2011Enum.valueOf()
нет ничего неправильного (хотя и с заглавными буквами), но довольно часто у вас просто есть байт или число, с которого нужно начинать. И пожалуйста: если строка не нужна, оставьте ее, посмотрите ужас строкового кодирования, если хотите знать, почему. По сути, вы должны постоянно спрашивать себя: когда я получаю строку, знаю ли я, что в ней? Он содержит намного больше состояний, чем целое число, или, действительно, перечисление и увеличение состояния - это плохо. - person Maarten Bodewes   schedule 22.12.2018