Sto lavorando (un po ') su un gioco di strategia (a turni). Ci sono due classi rilevanti per la domanda:
-
State
: questa è una classe immutabile, che espone tutti i suoi campi (sia via Getter o in un altro modo, come mi sembrava appropriato). Lo stato è un po 'complicato, quindi l'ho scomposto in diverse classi nel pacchetto...state
-
Command
: questa è una classe astratta immutabile con un paio di sottoclassi comeMoveCommand(Field from, Field to)
,PassCommand()
,BidCommand(int amount)
, ecc. nel pacchetto...command
. Tutti i campi hanno getter pubblici.
Ho bisogno di uno dei due metodi
-
State Command.applyTo(State)
o -
State State.apply(Command)
restituire il nuovo stato (ottenuto applicando il comando allo stato).
L'uso del primo metodo sembra migliore a prima vista, poiché invia a diverse implementazioni di applyTo
nelle sottoclassi di Command
. Sfortunatamente, mi costringe a giocherellare con i molti dettagli di State
nella classe Command
. Per farlo funzionare, ho bisogno di qualcosa come MutableState
, o State.Builder
, o un costruttore di molti-args di State
, o qualsiasi altra cosa.
L'uso del secondo metodo sembra brutto, in quanto mi costringerebbe a usare instanceof
(o qualche altro modo brutto per simulare il dispacciamento del metodo virtuale). OTOH, concentrerebbe il lavoro con State
nella classe stessa.
Quindi penso che il primo metodo sia la strada da percorrere. Con Command
e State
ciascuno nel suo stesso pacchetto significa che MutableState
(o qualunque cosa venga usato per creare il State
risultante) deve essere una classe pubblica poiché non ci sono friend
s in Java. Nessun problema reale, ma non bello, vero?
Quindi qual è il design corretto?