2013-03-08 122 views
8

我有一個要求來支持ChartTypes。這些圖表類型中的每一種都可以支持一些ChartSubTypes。例如AreaChart類型可以有PercentAreaStackedArea等我想用一個枚舉既爲ChartTypesSubTypes,然後保持某處的地圖,這將是這樣的:在這種情況下適用嵌套枚舉?

Map<ChartType,List<ChartSubTypes> mapTypes; 

我可以以某種方式使用嵌套枚舉模式這裏?如果是,那麼如何?

+0

'AreaChart','PercentArea'等,也是枚舉? – Mordechai 2013-03-08 07:22:01

+0

@MouseEvent是的,它們也是常量 – Geek 2013-03-08 07:22:40

+0

將它們建模爲類並使用繼承是否更有意義?也許你後來添加更多的圖表,你現在不知道? – keuleJ 2013-03-08 07:27:31

回答

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

可變參數可以有零個參數。

1

使用的接口,以組枚舉類型:

public interface ChartType { 
    public someCommonMethod(); 
} 

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

當然你也可以包含多個接口實現,即使你不知道它。您也可以將該接口用作參數(泛型或方法參數)類型。