在开发游戏项目时,我已经开始使用 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/Tuple(使用不可变的 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,但我对您的意见、论点和直觉很感兴趣 :)