我已經開始在Java中不可變值對象玩弄一個遊戲項目時,遵循「公開的最終場」的方法:如何在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);
...或者是關係團隊和TeamColor在一起的自定義類。
我趨向於選擇3或4,但我感興趣的是你的觀點,論據和直覺感受:)
或者使用*接口*(例如'ITeam','ITeamColor')..構造函數不能無論如何統一。 – 2012-08-04 17:02:24
如果你所有的球隊都有顏色,那麼它應該全部在一個班級中。 – Strelok 2012-08-04 17:15:19
這不是一個真正的答案,但我會說,你應該讓客戶端驅動器的接口設計(這是使用'Team'對象和顏色的代碼)。也就是說,先寫客戶端,然後把模型寫出來。然後使用你學到的東西來完善模型並完成它的實現。 – erickson 2012-08-04 18:31:46