Diciamo che ho un client che sta consumando Vehicle
oggetti inviati da un server.
Ho due tipi di veicoli: Car
e Truck
. Alcuni Car
s possono essere inHybridMode
ma non tutti. Il server attualmente fornisce tre modelli specifici in un elenco: Prius
, Camaro
e F150
. Nel client ho creato questa gerarchia:
abstract class Vehicle
String name;
abstract class Car extends Vehicle
abstract class Truck extends Vehicle
interface Hybrid
boolean isInHybridMode()
class Prius extends Car, implements Hybrid
class Camaro extends Car
class F150 extends Truck
Ho scelto di creare Hybrid
un'interfaccia in modo che la struttura di ereditarietà non sia pazzesca (e super disordinata se mai hai un camion ibrido).
Il client può facilmente creare questi veicoli dall'uscita del server (diciamo JSON). Controllo semplicemente il campo type
e creo la classe concreta appropriata.
[
{
"name":"bob's car",
"type":"Prius",
"inHybridMode":true
},
{
"name":"joe's car",
"type":"Camaro"
}
]
La mia domanda è: come posso gestire la situazione in cui il server mi restituisce un veicolo per il quale non ho (ancora) una lezione concreta?
{
"name":"alice's car",
"type":"Camry",
"inHybridMode":true
}
Le mie opzioni sono:
-
Ignora completamente questo tipo e non creare un oggetto. Ciò causerà problemi quando cerco di fare
vehicles.size()
. -
Crea
Vehicle
(eCar
eTruck
) non astratto e crea solo un oggettoVehicle
con il corrispondente camponame
-
Crea una nuova classe chiamata
UnknownHybrid extends Car, implements Hybrid
. Questo fungerà da catch-all per qualsiasi veicolo di tipo sconosciuto e ha il campoinHybridMode
. -
Crash orribilmente, costringendomi a implementare una classe
Camry
.
Mi piace il # 3 mentre questo problema è semplice, ma non voglio creare catch-alls per ogni combinazione di interfacce che creerò in seguito.
UPDATE:
Innanzitutto, grazie per tutte le ottime risposte.
Nel tentativo di semplificare il mio problema per la domanda, ho lasciato alcune cose che hai identificato. Risponderò a queste domande:
-
In realtà ho
type
emodel
. Il tipo può essere solo Car o Truck. Camry, Camaro, F150, ecc. È il modello. -
Ho solo bisogno del comportamento di auto, camion e ibridi. Non esiste una cosa come il comportamento di Camry, solo in quanto è un comportamento Car + Hybrid.
Ho aggiunto le classi del modello (Camry, F150, ecc.) in modo da avere una classe in grado di implementare l'interfaccia
Hybrid
. Io penso avrò meno modelli di combinazioni di interfacce. Alla fine avrò un altro comportamento "mix in" comeConvertible
,4WD
, ecc. Quindi ho pensato di creare solo classi per ogni modello invece di ogni combinazione di interfaccia (HybridConvertibleCar, ecc.) -
Per quanto riguarda i requisiti aziendali: visualizzare informazioni su Car, visualizzare le informazioni su Truck, visualizzare l'indicatore verde in modalità ibrida, gestire modelli sconosciuti che possono essere o meno ibridi, convertibili, 4wd.
La cosa che sto cercando di evitare (e l'implementazione corrente) è che tutto il comportamento per ibrido, convertibile, 4wd è tutto contenuto nella classe
Vehicle
. Quindi ho molti modelli che hanno campi / metodi che non li riguardano. Ad esempio, Truck ha un metodoisConvertibleTopDown
che restituisce sempre "false". -
C'è di più in
Hybrid
rispetto a isInHybridMode. Ne ho appena rimosso la maggior parte per rispondere alla domanda. -
Se tutto ciò che avevo era
Vehicle
visualizzerei solo dati specifici del veicolo (ad esempioname
).