在这种情况下使用适合的嵌套枚举?
我需要支持许多ChartTypes
。 这些图表类型中的每一种都可以支持许多ChartSubTypes
。 例如, AreaChart
类型可以有PercentArea
, StackedArea
等。我正在考虑为SubTypes
和SubTypes
使用Enum,然后在某处维护一个类似于以下内容的地图:
Map<ChartType,List mapTypes;
我可以在这里以某种方式使用嵌套的枚举模式吗? 如果是,那怎么样?
如果该定义是常量(即您知道哪些子类型可以包含每种类型)您可以在此处使用枚举定义,如下所示
enum ChartSubTypes{ PercentArea, StackedArea, ChartSubType3; } enum ChartTypes{ AreaChart(ChartSubTypes.PercentArea, ChartSubTypes.StackedArea), CharType2(ChartSubTypes.PercentArea, ChartSubTypes.ChartSubType3); private List subTypes = new ArrayList (); private ChartTypes(ChartSubTypes ...chartSubTypes){ for(ChartSubTypes subType : chartSubTypes){ subTypes.add(subType); } } public List getSubTypes(){ return Collections.unmodifiableList(subTypes); } }
是的,您可以将图表子类型添加到图表类型,如下所示:
public enum ChartType { AreaChart(SubChartType.PercentArea, SubChartType.StackedArea), AnotherChart(SubChartType.PercentArea); private List subChartTypes = new ArrayList<>(); ChartType(SubChartType... subChartTypes) { Collections.addAll(this.subChartTypes, subChartTypes); } public List getSubChartTypes() { return this.subChartTypes; } public static Map> getMapTypes() { HashMap> 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可以没有参数。
使用接口,对枚举类型进行分组:
public interface ChartType { public someCommonMethod(); } public enum AreaChart extends ChartType{ PercentArea { public someCommonMethod(){ //your code here } }, StackedArea { public someCommonMethod(){ //your code here } }; }
您当然可以包含该接口的多个实现,即使您还不知道它。 您也可以将接口用作参数(通用或方法参数)类型。