Итак, я мог наблюдать это поведение:
У нас есть следующее перечисление:
public enum SomeState {
One,
Two
}
и оператор switch для этого:
switch(object.getState()){
case One: doSomething("State One");break;
case Two: doSomething("State Two");break;
}
We 'мы сохранили объект с состоянием Два, поэтому он «переключится» на второй случай.
Теперь мы проведем рефакторинг enum.Мы переименовываем второе значение и добавляем новое:
public enum SomeState {
One,
NewTwo,
OldTwo
}
И новый оператор switch:
switch(object.getState()){
case One: doSomething("State One");break;
case NewTwo: doSomething("State New Two");break;
case OldTwo: doSomething("State Old Two");break;
}
Теперь этот объект «переключится» в состояние «NewTwo»,что совершенно неправильно!
К сожалению, это ошибка: я добавил сюда запись (http://tracker.db4o.com/browse/COR-2268).) Основная проблема заключается в странной обработке перечисления в db4o. На самом деле он хранит сам объект перечисления. При загрузкеобъект из базы данных восстанавливает состояние enum, даже материал в статических переменных! Если за это время рефакторинг состоялся, весь материал испорчен. В основном мы многократные перечисления с одинаковыми порядковыми номерами и испорченными именами.
На данный момент я бы порекомендовал избегать перечислений (на Java. В .Net работает обработка перечислений db4o) = (.
Редактировать: Предложение по миграции: Вы можете сделать это: Добавить 'refactored' перечисления какзаполните новые значения для перечисления. Затем загрузите все объекты, содержащие это перечисление, и измените значения на новые значения. После этого вы удалите старые значения перечисления.