Pri*_*ine 5 java oop enums design-patterns strategy-pattern
我目前正在开发一个项目,我们必须在3D环境中表示一组向量.我们有几种不同的可视化实现.
我想到了我可以将所有可视化类型捆绑在枚举中.我已经定义了一个Interface VectorVisualization和几个实现这个接口的实现.
现在我已经在Interface类中添加了以下枚举:
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);
}
Run Code Online (Sandbox Code Playgroud)
该标签适用于Gui中的JComboBox.所以我现在可以迭代枚举并获得不同类型的标签.另外要设置一个实现,我可以像这样使用枚举:
VectorVisualizationType.CYLINDER.getVisualization()
Run Code Online (Sandbox Code Playgroud)
但这是一个很好的方式吗?或者这种方法有什么问题吗?当然,现在当你创建一个新的实现时,你必须将它添加到枚举中.
感谢您的意见!
有趣的。我以前曾使用枚举类型来携带有用的元数据,但从未将其用于存储可执行代码片段。
也就是说,我在您的方法中看到的唯一问题是,正如您已经指出的那样,当您创建新的VectorVisualization
实现时,您将必须手动向枚举添加新条目。一般来说,我更愿意尽可能避免这种手动开销,但这实际上是个人喜好的问题。
如果您(以及与您一起处理此代码的其他人)意识到此限制并且不介意,那么我认为您的解决方案很好。
请注意,您当前的结构要求 everyVectorVisualization
以线程安全的方式实现,因为只有一个实例分发给通过枚举类型引用它的每个人。如果这是一个问题,您可以通过根据枚举存储实现类而不是实现实例来解决它,然后只需进行修改即可getVisualization()
在调用时创建关联实现类的新实例。这将对实现施加额外的限制VectorVisualization
,即每个实现都需要提供一个公共 0 参数构造函数来创建可用的实现实例。