在这种情况下使用适合的嵌套枚举?

时间:2013-03-08 07:12:19

标签: java design-patterns enums

我需要支持一些ChartTypes。每种图表类型都可以支持多个ChartSubTypes。例如,AreaChart类型可以包含PercentAreaStackedArea等。我正在考虑为ChartTypesSubTypes使用枚举,然后在某处保留一张地图将是这样的:

Map<ChartType,List<ChartSubTypes> mapTypes;

我可以在某种程度上使用嵌套的枚举模式吗?如果是,那么如何?

3 个答案:

答案 0 :(得分:5)

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

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);
    }
   }

答案 1 :(得分:3)

是的,您可以将图表子类型添加到图表类型中,如下所示:

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应该有一个或多个SubChartTypes,那么您将需要此构造函数来强制执行该要求。

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

Varargs可以没有参数。

答案 2 :(得分:1)

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

public interface ChartType {
    public someCommonMethod();
}

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

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