Tôi đã bắt đầu chơi xung quanh với các đối tượng có giá trị bất biến trong Java trong khi làm việc trên một dự án trò chơi, sau khi "lĩnh vực thức cộng đồng" cách tiếp cận:Làm thế nào để mở rộng loại không thay đổi trong Java
public class Team {
public final String name, flag;
public Team(String name, String flag) {
this.name = name;
this.flag = flag;
}
}
này hoạt động khá tốt cho tôi cho đến nay, nhưng tôi cần các bộ thông tin bổ sung khác nhau về nhóm trong các trường hợp khác nhau. Ví dụ: một đội có màu đã đặt trong một trận đấu. Câu hỏi đặt ra là, cách tốt nhất để giải quyết những tập hợp thông tin mở rộng này là gì? Tôi biết đây là một câu hỏi khá chung chung, nhưng tôi muốn tiếp tục sử dụng các đối tượng bất biến và có thể ảnh hưởng đến giải pháp.
Dưới đây là các tùy chọn tôi đã đưa ra. Hầu hết trong số họ có lẽ là "đủ tốt", nhưng tôi muốn tìm hiểu một số lý lẽ cho và chống lại họ để tham khảo trong tương lai.
Lựa chọn 1: Tất cả mọi thứ trong một lớp
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;
}
}
này có chỉ có một lớp học cho tất cả các mục đích sử dụng, nhưng không có loại dựa trên dấu hiệu của những dữ liệu thêm dự kiến / cung cấp.
Phương án 2: subclassing
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;
}
}
Điều này có thể làm cho một bình đẳng dựa trên nội dung() thực hiện không thể.
Lựa chọn 3: Thành phần
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;
}
}
Ít mã sao chép/soạn sẵn nếu dữ liệu đội bóng và thêm dữ liệu thường xuyên thay đổi một cách độc lập.
Lựa chọn 4: Cặp/tuple (sử dụng một lớp Pair bất biến)
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);
... hoặc với một lớp tùy chỉnh mà gắn Đội và TeamColor với nhau.
Tôi có xu hướng lựa chọn 3 hoặc 4, nhưng tôi quan tâm đến ý kiến của bạn, lý lẽ và cảm xúc ruột :)
Hoặc sử dụng * Giao diện * (ví dụ: 'ITeam',' ITeamColor') .. các nhà thầu không thể thống nhất anyway. –
Nếu tất cả các đội của bạn có màu, thì tất cả các đội phải có mặt trong một lớp. – Strelok
Nó không thực sự là một câu trả lời, nhưng tôi sẽ nói rằng bạn nên để cho khách hàng (mã đang sử dụng 'Team' đối tượng và màu sắc) lái xe thiết kế giao diện. Tức là, viết ứng dụng khách trước, chỉ cần đưa ra mô hình. Sau đó, sử dụng những gì bạn đã học để tinh chỉnh mô hình và hoàn thành việc triển khai mô hình. – erickson