Я хочу реализовать шаблон проектирования состояния в JPA. То, как я сейчас это делаю, описано в этом сообщении в блоге .
Автор использует перечисление, содержащее все доступные реализации состояний, вместо создания абстрактного класса / интерфейса для абстракции состояний и написания реализации для каждого состояния. Я считаю этот подход очень полезным, поскольку перечисления можно легко сериализовать в JPA, и вы можете сохранять текущее состояние вашего объекта без дополнительных усилий. Я также вложил интерфейс состояний и все классы состояний в перечисление, делая их приватными, поскольку они зависят от реализации и не должны быть видны ни одному клиенту. Вот пример кода перечисления:
public enum State {
STATE_A(new StateA()),
STATE_B(new StateB());
private final StateTransition state;
private State(StateTransition state) {
this.state = state;
}
void transitionA(Context ctx) {
state.transitionA(ctx);
}
void transitionB(Context ctx) {
state.transitionB(ctx);
}
private interface StateTransition {
void transitionA(Context ctx);
void transitionB(Context ctx);
}
private static class StateA implements StateTransition {
@Override
public void transitionA(Context ctx) {
// do something
ctx.setState(STATE_B);
}
@Override
public void transitionB(Context ctx) {
// do something
ctx.setState(STATE_A);
}
}
private static class StateB implements StateTransition {
@Override
public void transitionA(Context ctx) {
throw new IllegalStateException("transition not allowed");
}
@Override
public void transitionB(Context ctx) {
// do something
ctx.setState(STATE_A);
}
}
}
Я хотел бы поделиться этим с вами и поделиться своими мыслями об этом. Считаете ли вы это полезным? Как бы вы внедрили шаблон проектирования состояний в модель домена JPA?
Спасибо,
Тео