「パブリック最終フィールド」アプローチに従って、ゲームプロジェクトに取り組んでいるときに、Java で不変値オブジェクトをいじり始めました。
public class Team {
public final String name, flag;
public Team(String name, String flag) {
this.name = name;
this.flag = flag;
}
}
これまでのところ、これはかなりうまく機能していますが、さまざまな状況でチームに関するさまざまな追加情報が必要です。たとえば、チームには試合中に色が設定されています。問題は、これらの一連の拡張情報を処理する最善の方法は何かということです。これはかなり一般的な質問であることはわかっていますが、不変オブジェクトを使い続けたいと思っており、それが解決策に影響を与える可能性があります。
ここに私が思いついたオプションがあります。それらのほとんどはおそらく「十分」ですが、今後の参考のために、それらに対する賛否両論を学びたいと思います。
オプション 1: すべてを 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;
}
}
これはすべての用途で 1 つのクラスしか必要としませんが、どのような追加データが期待/提供されるかをタイプベースで示すものはありません。
オプション 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 に傾倒していますが、あなたの意見、議論、直感に興味があります :)