Это - та же самая проблема, с которой Java-разработчики Предприятия сталкиваются, упорствуя enum к базе данных. Проблема с существующими ответами состоит в том, что они хрупки и не благоприятны для рефакторинга. Вот то, почему (с альтернативой в основании.)
Используя enum's toString()
и valueOf()
методы означают, что перечисление значений не может быть переименовано. Предположим, что у меня есть VehicleType
enum с ценностями АВТОМОБИЛЬ
и ГРУЗОВИК
. Если я храню последовательность "ГРУЗОВИК" как предпочтительная стоимость и затем переименовываю VehicleType. ГРУЗОВИК
, чтобы VehicleType. PICKUP_TRUCK
в следующей версии моего приложения, сохраненная последовательность больше не имеет смысл, и valueOf()
бросит IllegalArgumentException
.
Используя средства ординала стоимости, что ценности enum не могут быть переупорядочены или больше не будут совпадать ваши сохраненные ценности. Этот сценарий возможно хуже, потому что ваше приложение продолжит бежать, но может вести себя неожиданными способами, делая проблему трудной разыскать, как только это наконец замечено и вероятно невозможное исправить. То же самое верно для добавления новой стоимости где угодно, но конца. Если бы я добавил новое МОТОЦИКЛ
стоимость наверху, АВТОМОБИЛЬ
сохраненный, когда его ординал (0) в предыдущей версии приложения возвратится как МОТОЦИКЛ
после обновления, и , то ГРУЗОВИК
(порядковый 1) стал бы АВТОМОБИЛЕМ
.
Альтернатива, которую я использую, должна добавить финал
область к enum и использовать его стоимость, как так:
public enum VehicleType {
CAR("C"),
TRUCK("T");
private final String code;
private static final Map valuesByCode;
static {
valuesByCode = new HashMap<>(values().length);
for(VehicleType value : values()) {
valuesByCode.put(value.code, value);
}
}
VehicleType(String code) {
this.code = code;
}
public static VehicleType lookupByCode(String code) {
return valuesByCode.get(code);
}
public String getCode() {
return code;
}
}
Сохраните стоимость, используя что-то как preferences.putString ("vehicle_type", vehicleType.getCode ())
и восстановите его, используя что-то как vehicleType = VehicleType.lookupByCode (preferences.getString ("vehicle_type", пустой указатель))
.
Этот подход требует небольшого дополнительного кода, но по-моему, это - наиболее надежное решение.