2013-03-08 14 views
8

Ich habe eine Anforderung, eine Anzahl von ChartTypes zu unterstützen. Jeder dieser Diagrammtypen kann eine Nummer ChartSubTypes unterstützen. Zum Beispiel kann AreaChart Typ PercentArea hat, StackedArea usw. Ich denke eine Enum sowohl für ChartTypes und SubTypes verwendet und dann eine Karte irgendwo zu halten, die so etwas wie sein:Verwendung von verschachtelten Enums in diesem Fall geeignet?

Map<ChartType,List<ChartSubTypes> mapTypes; 

Kann ich irgendwie ein verschachteltes Enum-Muster verwenden Hier? Wenn ja, wie?

+0

'AreaChart',' PercentArea' etc., sind auch enums? – Mordechai

+0

@MouseEvent ja sie sind auch Konstanten – Geek

+0

Wäre es nicht sinnvoller, sie als Klassen zu modellieren und Vererbung zu verwenden? Vielleicht fügen Sie später weitere Diagramme hinzu, die Sie jetzt nicht kennen? – keuleJ

Antwort

5

Wenn diese Definition konstant ist (dh Sie wissen, welche Untertypen jeder Art enthalten können) Sie Definitionen hier Enum können als

Ja
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

folgt, können Sie die Chart-Untertypen in den Diagrammtyp hinzufügen, wie also:

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

Um die gewünschte Karte zu erhalten, rufen Sie einfach ChartType.getMapTypes();.

Wenn die Anforderung ist, dass jeder ChartType einen oder mehrere SubChartTypes haben sollte, benötigen Sie diesen Konstruktor, um diese Anforderung zu erzwingen.

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

Varargs können keine Argumente haben.

1

Verwenden Schnittstellen zur Gruppe Enum-Typen:

public interface ChartType { 
    public someCommonMethod(); 
} 

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

Sie können natürlich mehrere Implementierungen dieser Schnittstelle enthalten, auch wenn Sie noch nicht davon wissen. Sie können die Schnittstelle auch als Parameter (generisches oder Methodenargument) verwenden.

Verwandte Themen