he empezado a jugar con objetos de valor inmutable en Java mientras se trabaja en un proyecto de juego, siguiendo el enfoque de "campos finales públicas":Cómo extender tipos inmutables en Java
public class Team {
public final String name, flag;
public Team(String name, String flag) {
this.name = name;
this.flag = flag;
}
}
Esto funciona bastante bien para mí hasta ahora, pero necesito diferentes conjuntos de información adicional sobre el equipo en diferentes circunstancias. Por ejemplo, un equipo tiene un color determinado durante un partido. La pregunta es, ¿cuál es la mejor manera de lidiar con estos conjuntos de información extendida? Sé que esta es una pregunta bastante general, pero quiero seguir usando objetos inmutables y eso podría influir en la solución.
Aquí están las opciones que se me han ocurrido. La mayoría de ellos probablemente sean "lo suficientemente buenos", pero me gustaría aprender algunos argumentos a favor y en contra de ellos para referencia futura.
Opción 1: Todo en una clase
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;
}
}
Esto toma sólo una clase para todos los usos, pero no hay ninguna indicación basada en el tipo de lo que se espera de datos extra/proporcionada.
Opción 2: La subclasificación
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;
}
}
Esto podría hacer que A es igual basadas en el contenido() aplicación imposible.
Opción 3: Composició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;
}
}
menos código copiado/repetitivo si los datos del equipo y los datos adicionales a menudo cambian de forma independiente.
Opción 4: Par/Tupla (usando una clase Par inmutable)
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);
... o con una clase personalizada que Curiosidades y TeamColor juntos.
que tienden a la opción 3 o 4, pero estoy interesado en sus opiniones, argumentos y sentimientos viscerales :)
O utilizar las interfaces * * (por ejemplo 'ITeam',' ITeamColor') .. los constructores no se pueden unificar todos modos. –
Si todos sus equipos tienen un color, entonces todo debería estar en una clase. – Strelok
No es realmente una respuesta, pero yo diría que debe dejar que el cliente (el código que está utilizando los objetos y colores de 'Equipo') controle el diseño de la interfaz. Es decir, escriba primero al cliente, simplemente anulando el modelo. Luego, use lo que aprendió para refinar el modelo y finalizar su implementación. – erickson