zacząłem zabawy z przedmiotami o wartości niezmienne w Javie podczas pracy nad projektem gry, zgodnie z podejściem „pól Ostateczne publiczne”:Jak przedłużyć niezmienne typy w Javie
public class Team {
public final String name, flag;
public Team(String name, String flag) {
this.name = name;
this.flag = flag;
}
}
Działa to bardzo dobrze dla mnie do tej pory, ale potrzebuję różnych zestawów dodatkowych informacji o zespole w różnych okolicznościach. Na przykład zespół ma ustawiony kolor podczas meczu. Pytanie brzmi, jaki jest najlepszy sposób na radzenie sobie z tymi zestawami rozszerzonych informacji? Wiem, że jest to dość ogólne pytanie, ale chcę nadal używać niezmiennych obiektów, które mogą wpłynąć na rozwiązanie.
Oto opcje, które wymyśliłem. Większość z nich jest prawdopodobnie "wystarczająco dobra", ale chciałbym nauczyć się kilku argumentów za i przeciw nim, aby móc je wykorzystać w przyszłości.
Wariant 1: Wszystko w jednej klasie
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;
}
}
To zajmuje tylko jedną klasę dla wszystkich zastosowań, ale jest wskazanie typu oparte nie o tym, co się spodziewać dodatkowych danych/świadczona.
Opcja 2: Utworzenie podklasy
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;
}
}
Może to zrobić A równa się zawartości oparte() realizacja niemożliwe.
Wariant 3: Skład
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;
}
}
Mniej kod kopiowanie/boilerplate jeśli dane team i dodatkowe dane często zmieniać niezależnie.
Opcja 4: Para/Tuple (stosując niezmienną klasę Pair)
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);
... lub z niestandardowej klasy, która łączy zespół i TeamColor razem.
Mam tendencję w kierunku wariantu 3 lub 4, ale jestem zainteresowany w twoich poglądów, argumentów i uczucia gut :)
Albo używać * interfejsy * (np 'ITeam',' ITeamColor') .. konstruktorzy nie mogą być ujednolicone i tak. –
Jeśli wszystkie drużyny mają kolor, wszystkie powinny należeć do jednej klasy. – Strelok
To naprawdę nie jest odpowiedź, ale chciałbym powiedzieć, że powinieneś pozwolić klientowi (kod, który używa obiektów i kolorów "Teamu") do projektowania interfejsu. Oznacza to, że najpierw napisz klienta, po prostu zagłuszaj model. Następnie wykorzystaj to, czego się nauczyłeś, aby udoskonalić model i zakończyć jego realizację. – erickson