【问题标题】:Use of Nested enums appropriate in this case?在这种情况下使用合适的嵌套枚举?
【发布时间】:2013-03-08 07:12:19
【问题描述】:

我需要支持多个ChartTypes。这些图表类型中的每一种都可以支持多个ChartSubTypes。例如AreaChart 类型可以有PercentAreaStackedArea 等。我正在考虑为ChartTypesSubTypes 使用枚举,然后在某处维护一个地图,类似于:

Map<ChartType,List<ChartSubTypes> mapTypes;

我可以在这里使用嵌套枚举模式吗?如果是那怎么办?

【问题讨论】:

  • AreaChartPercentArea等,也是枚举吗?
  • @MouseEvent 是的,它们也是常量
  • 将它们建模为类并使用继承不是更有意义吗?也许您稍后会添加更多您现在不知道的图表?
  • @keuleJ 枚举最适合需要有限硬编码集的需求。如果图表类型是一个或多个子图表类型,我仍然不会使用继承,但可能会使用组合。

标签: java design-patterns enums


【解决方案1】:

如果该定义是常量(即您知道哪些子类型可以包含每种类型)您可以在此处使用枚举定义,如下所示

enum ChartSubTypes{
    PercentArea, StackedArea, ChartSubType3;
}

enum ChartTypes{
    AreaChart(ChartSubTypes.PercentArea, ChartSubTypes.StackedArea), 
    CharType2(ChartSubTypes.PercentArea, ChartSubTypes.ChartSubType3);

    private List<ChartSubTypes> subTypes = new ArrayList<ChartSubTypes>();

    private ChartTypes(ChartSubTypes ...chartSubTypes){
        for(ChartSubTypes subType : chartSubTypes){
            subTypes.add(subType);
        }
    }

    public List<ChartSubTypes> getSubTypes(){
        return Collections.unmodifiableList(subTypes);
    }
   }

【讨论】:

    【解决方案2】:

    是的,您可以像这样将图表子类型添加到图表类型中:

    public enum ChartType {
        AreaChart(SubChartType.PercentArea, SubChartType.StackedArea), 
        AnotherChart(SubChartType.PercentArea);
    
        private List<SubChartType> subChartTypes = new ArrayList<>();
    
        ChartType(SubChartType... subChartTypes) {
            Collections.addAll(this.subChartTypes, subChartTypes);
        } 
    
        public List<SubChartType> getSubChartTypes() {
            return this.subChartTypes;
        }
    
        public static Map<ChartType,List<SubChartType>> getMapTypes() {
            HashMap<ChartType,List<SubChartType>> mapTypes = new HashMap<>();
            for (ChartType chartType : values()) {
                mapTypes.put(chartType, chartType.getSubChartTypes());
            }
            return mapTypes;
        }
    }
    

    要获取您想要的地图,只需致电ChartType.getMapTypes();

    如果要求每个 ChartType 应该有一个或多个 SubChartType,那么您将需要此构造函数来强制执行该要求。

    ChartType(SubChartType requiredSubType, SubChartType... subChartTypes) {
        this.subChartTypes.add(requiredSubType);
        Collections.addAll(this.subChartTypes, subChartTypes);
    } 
    

    可变参数可以有零个参数。

    【讨论】:

      【解决方案3】:

      使用接口,对枚举类型进行分组:

      public interface ChartType {
          public someCommonMethod();
      }
      
      public enum AreaChart extends ChartType{
          PercentArea {
              public someCommonMethod(){
                  //your code here
              }
          }, 
          StackedArea {
              public someCommonMethod(){
                  //your code here
              }
          };
      }
      

      您当然可以包含该接口的多个实现,即使您还不知道它。您也可以将接口用作参数(泛型或方法参数)类型。

      【讨论】:

        猜你喜欢
        • 2012-07-04
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多