Ist es möglich, Enums-Instanzvariablen in Groovy mit einem eigenen Typ zu versehen?

8

Ich mache ein Text Adventure-Spiel in Groovy als eine Art Übung, und ich stoße in einen seltsamen Fehler.

Im Moment habe ich enum für die Richtungen, in die ein Spieler gehen kann, die derzeit Norden, Süden, Osten, Westen, Auf und Ab enthalten.

Ich habe eine Klasse Room , die Map anderer verbundener Räume und deren Richtungen enthält. Wenn ich eine Room zu einer anderen Room bei einer bestimmten Direction hinzufüge, möchte ich auch die aktuelle Room zu der anderen Room in der entgegengesetzten Richtung hinzufügen können.

Beispiel: Wenn ich eine Verbindung von Raum 1 zu Raum 2 nach Norden hinzufüge, möchte ich in der Lage sein, gleichzeitig eine Verbindung von Raum 2 zu Raum 1 hinzuzufügen.

Momentan versuche ich dies mithilfe einer enum namens Direction mit einer angehängten Instanzvariable opposite (vom Typ Direction ) zu implementieren. Ist das nicht erlaubt? Ich erhalte keine Compilerfehler oder ähnliches, aber ich kann es nicht funktionieren lassen.

Hier ist die vollständige enum Deklaration:

%Vor%

Und das ist die Methode, von der ich es nenne:

%Vor%

wobei connections ein public Map<Direction, Spot> ist.

In diesem Fall wird ein Eintrag zu connections hinzugefügt, der wie folgt aussieht:

%Vor%

Jede Hilfe wäre großartig. Danke!

    
Benjamin Kovach 02.07.2012, 22:57
quelle

3 Antworten

8

Groovy scheint zu umgehen, was in Java ein Kompilierungsfehler ist:

%Vor%

Der groovy Compiler beklagt sich nicht darüber, sondern initialisiert die Enum-Werte, die Vorwärtsdeklarationen als null benötigen:

%Vor%

Ausgaben :

%Vor%

Eine Lösung, die in Java anscheinend gut funktioniert, ist das Hinzufügen eines Blocks static in der Klasse Direction , um% zu initialisieren. co_de% -Werte. Übersetzt zu Groovy, das wäre:

%Vor%

Was nun die korrekten Werte ausgibt :

%Vor%

Aktualisieren

Eine andere, vielleicht einfachere Lösung kann die Richtungsindizes auf der Enumeration verwenden, um die Gegensätze zu finden:

%Vor%

Aber ich finde den ersten klarer, da er diese magischen Zahlen für die Indizes nicht benötigt hehe.

Update 2

Jetzt werde ich wahrscheinlich ein bisschen in die Golfländer kommen, aber Sie können die entgegengesetzte Richtung ohne die Notwendigkeit eines zusätzlichen Feldes bekommen , nur mit den Enum-Werten opposite (ihr Index):

%Vor%

Es ist nicht so gruselig wie es aussieht! Sogar Richtungen (Nord, Ost, Hoch) geben die Richtung bei ordinal() als ihr Gegenteil zurück, während ungerade Richtungen (die anderen) die Einsen bei ordinal() + 1 zurückgeben. Natürlich ist es stark abhängig von der Reihenfolge der Elemente in der Enum, aber, magst du nicht die Prägnanz? = D

    
epidemian 02.07.2012, 23:57
quelle
2

Sie könnten die Bewertung des Gegenteils aufschieben, indem Sie es in einer Schließung übergeben und die Schließung aufrufen, wenn Sie das Gegenteil wollen:

%Vor%

Ausgaben:

%Vor%     
Paul 05.03.2013 17:05
quelle
1

Es sieht so aus, als ob die Hälfte von Directions nicht initialisiert wird, wenn der Enum-Konstruktor aufgerufen wird. Das heißt, wenn Sie North(South) aufrufen, wurde South nicht initialisiert. Es steht an der Reihe.

Sie befinden sich in einem Hühner- / Eier-Paradoxon, bei dem alle der Enum-Konstanten initialisiert werden müssen, bevor eins von ihnen sein kann. Es sieht so aus, als müssten Sie einen Teil Ihres Codes reorganisieren, um dies zu berücksichtigen. Ich könnte vorschlagen:

%Vor%

Dies verwendet den bitweisen Operator ~ , um Gegensätze zu unterscheiden.

    
gobernador 02.07.2012 23:30
quelle

Tags und Links