Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用枚举作为实现的容器_Java_Oop_Design Patterns_Enums_Strategy Pattern - Fatal编程技术网

Java 使用枚举作为实现的容器

Java 使用枚举作为实现的容器,java,oop,design-patterns,enums,strategy-pattern,Java,Oop,Design Patterns,Enums,Strategy Pattern,我目前正在做一个项目,我们必须在3D环境中表示一组向量。我们有几种不同的可视化实现 我的想法是,我可以将所有可视化类型捆绑在一个枚举中。我已经定义了一个接口矢量可视化和几个实现这个接口的实现 现在,我已将以下枚举添加到接口类中: public interface VectorVisualization { public enum VectorVisualizationType { CYLINDER(new VectorVisualizationCylinder(), "C

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

我的想法是,我可以将所有可视化类型捆绑在一个枚举中。我已经定义了一个接口矢量可视化和几个实现这个接口的实现

现在,我已将以下枚举添加到接口类中:

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);
}
但这是个好办法吗?或者这种方法有什么问题吗?当然,现在当您创建了一个新的实现时,您必须将其添加到枚举中


谢谢你的意见

有趣。我以前使用过枚举类型来携带有用的元数据位,但从未将其扩展到存储可执行代码的程度

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

如果您(以及与您一起处理此代码的所有其他人)意识到这个约束并且不介意,那么我认为您的解决方案是好的


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

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


但这也使得以可插拔的方式扩展当前集合变得不可能——因此第三方无法添加新的实现。正是因为这个原因,我通常喜欢使用一个能够容纳所有实现的单例管理器。这种模式也适用于许多组件框架,如OSGi。

谢谢您的回答!这是线程安全的一个很好的观点。但在我们的情况下,这不应该是一个问题。提供类似功能的另一种方法是使用映射,其中使用枚举作为键,使用向量可视化作为值。但是当添加新的实现时,您必须在两个代码位置(而不是一个带有enum的位置)定义它。。因此,我仍然站在enum一边:)。@Prine-是的,我在过去多次使用基于映射的方法,但与使用enum所做的工作相比,它没有任何好处(可能的例外:您可以在运行时向映射动态添加新条目,和/或删除现有条目),因此我没有提到它。下次我需要它时,我可以试试你的基于枚举的想法。
VectorVisualizationType.CYLINDER.getVisualization()