Je veux mettre en œuvre le modèle de conception d'état dans JPA. La façon dont je procède actuellement est décrite dans ce qui suit article de blog .
L'auteur utilise un enum contenant toutes les implémentations d'état disponibles au lieu de créer une classe/interface abstraite pour l'abstraction d'état et d'écrire une implémentation pour chaque état. Je trouve cette approche très utile, car les enums peuvent être facilement sérialisés dans JPA et vous pouvez stocker l'état actuel de votre objet sans effort supplémentaire. J'ai également imbriqué l'interface d'état et toutes les classes d'état dans l'enum en les rendant privées, puisqu'elles sont spécifiques à l'implémentation et ne doivent pas être visibles par un client. Voici un exemple de code de l'enum :
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);
}
}
}
J'aimerais vous en faire part et recueillir votre avis à ce sujet. Trouvez-vous cela utile ? Comment implémenteriez-vous le design pattern state dans un modèle de domaine JPA ?