ho iniziato a giocare con oggetti di valore immutabili in Java mentre si lavora su un progetto di gioco, seguendo l'approccio "campi finali pubblici":Come estendere i tipi immutabili in Java
public class Team {
public final String name, flag;
public Team(String name, String flag) {
this.name = name;
this.flag = flag;
}
}
Questo funziona abbastanza bene per me finora, ma ho bisogno di diverse serie di informazioni aggiuntive sulla squadra in diverse circostanze. Ad esempio, una squadra ha un colore impostato durante una partita. La domanda è: qual è il modo migliore per gestire questi set di informazioni estese? So che questa è una domanda abbastanza generale, ma voglio continuare a usare oggetti immutabili e questo potrebbe influenzare la soluzione.
Ecco le opzioni che ho trovato. Molti di loro sono probabilmente "abbastanza buoni", ma mi piacerebbe imparare alcuni argomenti a favore e contro di loro per riferimenti futuri.
Opzione 1: Tutto in una classe
public class Team {
public final String name, flag, colorName;
public final int colorRgb;
public Team(String name, String flag, String colorName, int colorRgb) {
this.name = name;
this.flag = flag;
this.colorName = colorName;
this.colorRgb = colorRgb;
}
}
Questo richiede solo una classe per tutti gli usi, ma non v'è alcuna indicazione di ciò che ci si aspetta i dati extra/forniti tipo-based.
Opzione 2: Subclassing
public class TeamWithColor extends Team {
public final String colorName;
public final int colorRgb;
public Team(String name, String flag, String colorName, int colorRgb) {
super(name, flag);
this.colorName = colorName;
this.colorRgb = colorRgb;
}
}
Questo potrebbe rendere un contenuto a base di equals() implementazione impossibile.
Opzione 3: Composizione
public class TeamWithColor {
public final Team team;
public final String colorName;
public final int colorRgb;
public Team(Team team, String colorName, int colorRgb) {
this.team = team;
this.colorName = colorName;
this.colorRgb = colorRgb;
}
}
meno codice copia/boilerplate se i dati del team e dati aggiuntivi spesso cambiano in modo indipendente.
Opzione 4: Coppia/Tuple (utilizzando una classe Pair immutabile)
public class TeamColor {
public final String colorName;
public final int colorRgb;
public Team(String colorName, int colorRgb) {
this.colorName = colorName;
this.colorRgb = colorRgb;
}
}
Pair<Team, TeamColor> teamWithColor = Pair.create(team, teamColor);
... o con una classe personalizzata che lega Team e TeamColor insieme.
tendo verso l'opzione 3 o 4, ma mi interessa le vostre opinioni, argomenti e sentimenti viscerali :)
Oppure utilizzare * * interfacce (ad esempio 'ITeam',' ITeamColor') .. i costruttori non possono essere unificate in ogni caso. –
Se tutte le tue squadre hanno un colore, dovrebbe essere tutto in una classe. – Strelok
Non è davvero una risposta, ma direi che dovresti lasciare che il client (il codice che usa oggetti e colori 'Team') guidi il design dell'interfaccia. Cioè, scrivi prima il cliente, basta eliminare il modello. Quindi usa ciò che hai imparato per perfezionare il modello e completare la sua implementazione. – erickson