Kombinieren von Enums und Verwenden von Getter zum Zurückgeben einer angegebenen Enumeration

7

Nehmen wir an, ich habe zwei verschiedene Sets von Enums: Obst und Gemüse.

%Vor%

Ich zeige das alles in einer JComboBox an. Nachdem jemand etwas ausgewählt hat, möchte ich eine Getter-Methode verwenden, um die Enum zu erhalten.

Für ein einzelnes Enum würde ich etwas tun wie:

%Vor%

Irgendwelche Ideen, was der Rückgabetyp ist? Ich habe versucht, Enum anstelle von Fruits zu verwenden. Wenn ich das tue, habe ich anscheinend keinen Zugriff auf die Methoden getName ().

    
dalawh 15.07.2013, 03:29
quelle

5 Antworten

16

Hier ist eine weitere Demonstration dessen, wonach Sie suchen. Der Unterschied zwischen diesen und früheren Lösungen besteht darin, dass dieses ein generischeres und wiederverwendbares Muster ist. Dies geht tatsächlich über das ursprüngliche Problem hinaus, um einige andere Vorteile dieses Ansatzes aufzuzeigen. Sie können also nur die Bits kommentieren, die Sie nicht benötigen. Ich schließe auch einen Komponententest an, um das Verhalten zu demonstrieren.

Um im Grunde nach dem Namen Apple oder APPLE in einem dieser Enums zu suchen, schreiben Sie einfach:

FruitVeg<?> fvg = getEnum("APPLE", Fruits.class, Vegetables.class);

FruitVeg<> ist eine Schnittstelle, die es ermöglicht, auch innerhalb von Enum zu tippen. Diese Schnittstelle erlaubt einige sehr interessante Dinge mit Enums unten zu tun. Hier sind nur einige der Dinge, die Sie damit tun könnten:

  • Enum.valueOf(fvg.getDeclaringClass(), fvg.name()) : gibt den Enum-Wert zurück, z. APPLE

  • fvg.getRaw() : gibt den Enum-Wert zurück, z. APPLE

  • fvg.name() : gibt den Stringnamen der Enumeration zurück z. APPLE

  • fvg.getFriendlyName() : z.B. Apple

  • fvg.getDeclaringClass() : gibt Class<Enum<?>> z. Klasse ox.dummy.dummyTest $ Fruits

  • fvg.getClass() : Klasse ox.dummy.dummyTest $ Früchte gibt Class<?>

  • zurück
  • EnumSet.allOf(fvg.getDeclaringClass())) : z.B. [APPLE, PEAR]

Hier ist Code

%Vor%     
husayt 04.11.2013 22:50
quelle
3

Option 1.
Erstellen Sie eine Methode, die Enum

zurückgibt %Vor%

und um den Namen von enum zu erhalten, können Sie diese Methode verwenden

%Vor%

Option 2.
Sie können 2 Aufzählungen als

kombinieren %Vor%     
Ashish Aggarwal 15.07.2013 03:43
quelle
1

Übergeben Sie die Enums selbst als Werte. Dann verwenden Sie getSelectedItem , um das ausgewählte Objekt abzurufen , und führen Sie einen Test durch, um zu sehen, um welchen Typ sich das Objekt handelt.

Machen Sie den Rückgabetyp Ihrer Methode zu einem Objekt, nicht zu einer Aufzählung eines bestimmten Typs. Dies würde Ihr Problem beheben.

Ich denke jedoch, dass Ihre Herangehensweise falsch ist. Wenn ich Obst und Gemüse in einer Liste anzeigen und in Kategorien einteilen wollte, würde ich ein Objekt dafür erstellen, und ein Enum, um die Art des Essens so darzustellen:

%Vor%

Und fügen Sie nur Food -Elemente zu Ihrer JComboBox hinzu. Geben Sie Food -Einträge zurück, wenn eine Auswahl getroffen wurde, und testen Sie mithilfe von FoodType enum auf den Typ der Lebensmittel.

    
William Morrison 15.07.2013 03:44
quelle
0

Es klingt wie das, was Sie suchen, ist die Fähigkeit, Vererbung auf enums anzuwenden, aber dies ist in Java nicht möglich, da enums implicity java.lang.Enum erweitern und Java keine Mehrfachvererbung unterstützt.

Trotzdem glaube ich, dass verschachtelte Enums "könnte Ihr Problem lösen. Mit "verschachtelt" meine ich die Implementierung einer Schnittstelle, um das Problem der Mehrfachvererbung zu umgehen. Es gibt ein paar verschiedene Ansätze in den Antworten im Link, ich nehme an, einer von ihnen wird ausreichen.

    
Steve P. 15.07.2013 03:42
quelle
0

Sie könnten Object verwenden, anstatt explizit Fruit oder Vegetables

zu verwenden %Vor%

Der Nachteil davon ist jedoch, dass Sie dann das Ergebnis vergleichen und an das Ergebnis anpassen müssen, was Sie wollen

%Vor%     
Java Devil 15.07.2013 03:47
quelle

Tags und Links