Actualmente estoy trabajando en un proyecto en el que tenemos que representar un conjunto de vectores en un entorno 3D. Tenemos varias implementaciones de visualización diferentes.Uso de enumeraciones como contenedor de implementaciones
Llegué a la idea de que podía agrupar todos los tipos de visualización en una enumeración. He definido una interfaz VectorVisualization y varias implementaciones que implementan esta interfaz.
Ahora he añadido a la clase de interfaz de la siguiente enumeración:
public interface VectorVisualization {
public enum VectorVisualizationType {
CYLINDER(new VectorVisualizationCylinder(), "Cylinder"),
CONES(new VectorVisualizationCones(), "Cones"),
FATCONES(new VectorVisualizationFatCones(), "Fat cones"),
ARROWS(new VectorVisualizationArrows(), "Arrows");
private final String label;
private final VectorVisualization vis;
VectorVisualizationType(VectorVisualization vis, String label) {
this.vis = vis;
this.label = label;
}
public VectorVisualization getVisualization() {
return this.vis;
}
public String getLabel() {
return this.label;
}
}
void prepareVBO(GL gl, ArrayList<VectorData> vectors, VectorField field);
void render(GL gl);
void clearOldVBOS(GL gl);
}
La etiqueta es para un JComboBox en la GUI. Así que ahora puedo simplemente iterar sobre la enumeración y obtener la etiqueta de los diferentes tipos. También para establecer una Implementación puedo usar la enumeración de esa manera:
VectorVisualizationType.CYLINDER.getVisualization()
¿Pero esta es una buena manera? ¿O hay algún problema con ese enfoque? Por supuesto, ahora que ha creado una nueva implementación, debe agregar esto a la enumeración.
¡Gracias por su opinión!
Gracias por su respuesta! Ese es un buen punto con el Thread-Safety. Pero en nuestro caso, no debería ser un problema. Otra forma de proporcionar una funcionalidad similar sería usar un mapa donde usaría la enumeración como clave y VectorVisualization como un valor. Pero cuando agrega una nueva implementación, debe definirla en dos ubicaciones de código en lugar de una con la enumeración ... Así que todavía estoy en el lado de la enumeración :). – Prine
@Prine - Sí, he utilizado el enfoque basado en mapas varias veces en el pasado, pero no proporciona ningún beneficio sobre lo que ha hecho con la enumeración (posible excepción: puede agregar nuevas entradas al mapa dinámicamente en tiempo de ejecución, y/o eliminar los existentes), así que no lo mencioné. La próxima vez que lo necesite, probaré tu idea enum. – aroth