8

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

Map<ChartType,List<ChartSubTypes> mapTypes;

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

4

3 回答 3

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);
    }
   }
于 2013-03-08T07:19:43.983 回答
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 应该有一个或多个 SubChartType,那么您将需要此构造函数来强制执行该要求。

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

Varargs 可以有零个参数。

于 2013-03-08T07:23:59.193 回答
1

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

public interface ChartType {
    public someCommonMethod();
}

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

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

于 2013-03-08T07:28:20.720 回答