Я начал экспериментировать с неизменяемыми объектами-значениями в Java во время работы над игровым проектом, следуя подходу «открытых конечных полей» :
public class Team {
public final String name, flag;
public Team(String name, String flag) {
this.name = name;
this.flag = flag;
}
}
. Пока это работает довольно хорошо для меня, но мне нужны разные наборы дополнительной информации о команде в разных обстоятельствах. Например, у команды есть установленный цвет во время матча. Вопрос в том, как лучше всего работать с этими наборами расширенной информации? Я знаю, что это довольно общий вопрос, но я хочу продолжать использовать неизменяемые объекты, и это может повлиять на решение.
Вот какие варианты я придумал. Большинство из них, вероятно, «достаточно хороши», но я хотел бы узнать некоторые аргументы за и против них для дальнейшего использования.
Вариант 1 :Все одним классом
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;
}
}
Это требует только одного класса для всех применений, но нет основанного на типе -указания того, какие дополнительные данные ожидаются/предоставляются.
Вариант 2 :Подклассы
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;
}
}
Это может сделать невозможным реализацию на основе контента -equals ().
Вариант 3 :Состав
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;
}
}
Меньше копирования / шаблонного кода, если данные команды и дополнительные данные часто меняются независимо.
Вариант 4 :Пара/кортеж (с использованием неизменяемого класса 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);
... или с пользовательским классом, который связывает Team и TeamColor вместе.
Я склоняюсь к варианту 3 или 4, но меня интересуют ваши мнения, аргументы и интуиция:)