2013-03-08 11 views
8

Ho bisogno di supportare un numero di ChartTypes. Ciascuno di questi tipi di grafici può supportare un numero di ChartSubTypes. Per esempio AreaChart tipo può avere PercentArea, StackedArea ecc sto pensando di utilizzare un Enum sia per ChartTypes e SubTypes e poi mantenere una mappa da qualche parte che sarà qualcosa di simile a:L'uso di enumerazioni annidate è appropriato in questo caso?

Map<ChartType,List<ChartSubTypes> mapTypes; 

Posso usare in qualche modo un modello enum nidificato Qui? Se sì allora come?

+0

'AreaChart',' PercentArea' ecc., Sono anche enumerazioni? – Mordechai

+0

@MouseEvent si sono anche costanti – Geek

+0

Non avrebbe più senso modellarle come classi e usare l'ereditarietà? Forse stai aggiungendo più grafici in seguito che non conosci adesso? – keuleJ

risposta

5

Se tale definizione è costante (cioè Sai che sottotipi possono contenere ogni tipo) È possibile utilizzare qui le definizioni enum come segue

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

Sì, è possibile aggiungere i tipi di grafici secondari per il tipo di grafico come quindi:

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

Per ottenere la mappa desiderata, chiamare semplicemente ChartType.getMapTypes();.

Se il requisito è che ogni ChartType debba avere uno o più SottocartTypes, è necessario questo costruttore per far rispettare tale requisito.

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

Varargs può avere argomenti zero.

1

utilizzare le interfacce, ai tipi enum Gruppo:

public interface ChartType { 
    public someCommonMethod(); 
} 

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

Ovviamente si può contenere più implementazioni di tale interfaccia, anche se non si sa di esso ancora. Puoi usare l'interfaccia anche come parametro (tipo generico o metodo).

Problemi correlati