Sto lavorando su una libreria Java per Magic: the Gathering. Bene, senza entrare nel dettaglio, nel gioco ci sono cinque diversi colori di magia: white
, blue
, black
, red
e green
. È abbastanza facile, è un esempio da manuale di enum. Tuttavia, c'è un problema: ci sono diverse varianti su questi colori. Ci sono le tue varianti standard, le varianti "ibrido monocolore" e le varianti "Phyrexian" (non chiedere). Quindi, la mia domanda è, quale di questi è un approccio migliore?
Idea 1:
enum Symbol {
WHITE,
BLUE,
BLACK,
RED,
GREEN,
MONOCOLORED_HYBRID_WHITE,
MONOCOLORED_HYBRID_BLUE,
...
PHYREXIAN_WHTIE,
PHYREXIAN_BLUE,
...
}
Idea 2:
interface Symbol {
method1()
method2()
...
}
enum Primary implements Symbol {
WHITE,
BLUE,
...
}
enum MonocoloredHybrid implements Symbol {
WHITE,
BLUE,
...
}
enum Phyrexian implements Symbol { ...
Ho usato il primo modo per un po ', ma ho iniziato a pensare che il secondo modo potrebbe essere migliore. Mostra più chiaramente che queste classi di simboli sono diverse, ma comunque compatibili, poiché implementano la stessa interfaccia. Causerà un po 'di codice boilerplate (solo un paio di campi), ma il mio problema principale è che ho tre costanti enum chiamate WHITE
. Ora, mi riferisco sempre al loro nome di classe, ad es. Primary.WHITE
, ma questo sembra ancora un po 'imbarazzante. Ma forse è meglio del "Smurf naming" che dovrei fare nella prima tecnica. (Non posso nemmeno usarli in EnumMap / EnumSet nel secondo modo, ma penso di essere d'accordo.)
Quindi, qual è l'approccio migliore? Va bene avere un sacco di classi enum tutte che dichiarano costanti con lo stesso nome? C'è una terza alternativa che è ancora meglio?