使用枚举作为实现的容器

时间:2011-08-06 12:39:14

标签: java oop design-patterns enums strategy-pattern

我目前正在开展一个项目,我们必须在3D环境中表示一组矢量。我们有几种不同的可视化实现。

我想到了我可以将所有可视化类型捆绑在枚举中。我已经定义了一个接口 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);
}

标签用于Gui中的JComboBox。所以我现在可以迭代枚举并获得不同类型的标签。另外,为了设置一个实现,我可以像这样使用枚举:

VectorVisualizationType.CYLINDER.getVisualization()

但这是一个不错的方式吗?或者这种方法有什么问题吗?当然,现在当你创建一个新的实现时,你必须将它添加到枚举。

感谢您的意见!

2 个答案:

答案 0 :(得分:1)

有趣。我以前使用枚举类型来携带有用的元数据,但是从来没有像存储可执行代码那样。

也就是说,我看到的唯一问题是,正如您已经注意到的那样,当您创建新的VectorVisualization实现时,您必须手动向枚举添加新条目。一般来说,我倾向于尽可能避免这种手动开销,但实际上这是个人偏好的问题。

如果您(以及其他所有与您一起处理此代码的人)都知道此约束并且不介意,那么我认为您的解决方案很好。

请注意,您当前的结构要求每个VectorVisualization都以线程安全的方式实现,因为只有一个实例分发给通过枚举类型引用它的每个人。如果这是一个问题,您可以通过针对枚举而不是实现实例存储实现类来解决它,然后简单地修改getVisualization()以在调用时创建关联实现类的新实例。这会对VectorVisualization实现施加额外限制,每个实现都需要提供一个公共0参数构造函数,该构造函数创建一个可用的实现实例。

答案 1 :(得分:1)

使用枚举列出当前实现有许多非常好的属性。例如。很容易找到所有当前的实现,因为它们的定义必须在枚举声明中列出,并且您具有标准enum接口以访问实现。

但它也无法以可插拔的方式扩展当前集 - 因此第三方无法添加新的实现。出于这个原因,我通常喜欢使用能够容纳所有实现的单例管理器。这种模式也可以很好地与许多组件框架一起使用,如OSGi。