Können Java-Methoden den Typ Enum zurückgeben?

7

Ich könnte mich irren, aber ich rate von Warum können Enums nicht lokal in einer Methode deklariert werden?  Da eine Enum in Java nicht lokal deklariert werden kann, ist es daher problematisch, dass eine Methode den Typ Enum zurückgibt. Ich kann deklarieren, dass eine Methode eine Enum zurückgeben soll (siehe unten), aber wie würde man dann eine solche Methode implementieren, um etwas anderes als null zurückzugeben, oder einen Verweis auf eine außerhalb der Methode deklarierte Enum? Meine erste Neigung wäre es, mit Generics dafür zu forschen, aber ich würde gerne irgendwelche Deadends vermeiden, wenn die SO-Community mir helfen könnte, sie zu vermeiden.

%Vor%     
George Jempty 15.09.2009, 20:48
quelle

7 Antworten

8

Ich denke, Sie haben Recht, es ist nur in der Lage, entweder null oder Enum an anderer Stelle anzugeben. Aber Sie müssen nicht unbedingt "etwas anderes" zur Kompilierzeit angeben.

%Vor%

Später rufen Sie es auf, indem Sie den generischen Konstruktor spezialisieren und die Enum-Klasse übergeben, an der Sie interessiert sind:

%Vor%

(Offensichtlich ist dies ein künstliches Beispiel und im wirklichen Leben sollten Sie einfach Foo.values ​​() aufrufen, aber Sie bekommen die Idee.)

    
David Moles 17.09.2009, 10:46
quelle
3

Der ganze Sinn von Java für Enums besteht darin, dass sie typsicher ist - also würden Sie kein Enum (das wäre doppelt plus ungood) zurückgeben, stattdessen geben Sie den tatsächlichen Typ zurück, den Sie definieren (wie "Suit") was genau wie eine Klasse funktioniert. Suit hat 4 "Enumerated" -Instanzen.

Wenn Sie einen "Anzug" erwarteten, was wäre es gut, wenn Sie einen "Rang" von 7 zurückgeben würden? Es würde alles zerstören!

Auch wenn Sie einen "Enum" oder einen generischen Wert übergeben haben, können Sie keine Methoden aufrufen. Das Coolste an TypeSafe Enums ist, dass Sie einfach einen "Suit" erhalten und "Suit.getColor ()" aufrufen können und erwarten, dass Sie die Farbe dieses Anzugs erhalten. Du könntest auch einen rangsHigherThan (Suit s) haben, der folgendes erfüllen könnte:

%Vor%

Oder, was noch wichtiger ist:

%Vor%

(vorausgesetzt, sie waren beide hereingekommen und Sie wissen nicht, was sie sind)

Typ Sicherheit ist wirklich erstaunlich (obwohl es zunächst ein wenig unangenehm ist), umarmen Sie es.

    
Bill K 15.09.2009 21:35
quelle
3

Alle Enums implementieren die Schnittstelle Enum, so dass Sie sicherlich eine Methode schreiben können, die eine Enum auf diese Weise zurückgibt. Diese Methode gibt jedoch einen einzelnen Enum-Wert zurück. Es gibt keine Möglichkeit, einen generischen Wert zurückzugeben, der das ganze Enum umfasst (abgesehen von der Rückgabe der Klasse und der Reflexion). Sie können jedoch alle Enum-Werte zurückgeben, mehr oder weniger was Sie wollen, denke ich.

%Vor%

Ein Vorteil dieses Ansatzes besteht darin, dass Sie mehr oder weniger Werte zurückgeben können, zum Beispiel:

%Vor%

Ein noch besserer Ansatz, der typensicherer ist, besteht darin, die Enums von Interesse zu haben implementieren Sie eine gemeinsame Schnittstelle, z. B.

%Vor%

Sie können der Schnittstelle zusätzliche Methoden hinzufügen, um mehr Funktionalität bereitzustellen.

    
Dean Povey 15.09.2009 21:01
quelle
2

Was versuchst du zu erreichen? Dies ist eine Möglichkeit, ein Enum zurückzugeben:

%Vor%

Aber ich vermute, das ist nicht das, wofür du hingehst?

    
davetron5000 15.09.2009 20:56
quelle
1

Ja, das ist definitiv möglich.

%Vor%

Wenn es sich um eine Deklaration Enums handelt, können Sie sie wie folgt deklarieren:

  • in einer eigenen Java-Datei, ähnlich einem Top-Level class ;
  • in einer Java-Datei, die zu einer anderen Klasse gehört, ähnlich einer statischen inneren class ;
Robert Munteanu 15.09.2009 20:58
quelle
1

Sie sind sich nicht ganz sicher, was Ihr Ziel ist, aber wenn Sie eine generierte Methode (d. h. eine, die überschrieben werden würde) zurückgeben möchten, haben Sie möglicherweise Folgendes:

%Vor%

Nicht ganz sicher, was Sie dort gewinnen würden, obwohl es von Vorteil sein kann, wenn Sie über verschiedene Sets von Enums und ihren Elementen sprechen.

Wenn Sie über die Enum-Klasse sprechen (d. h. den Vorläufer zu Iterator), so weit ich weiß, wurde sie nicht generifiziert, daher bin ich nicht sicher, ob Generika hier viel helfen würden.

    
aperkins 15.09.2009 20:58
quelle
1

Sie können sich auf einen Wert einer Aufzählung anhand ihres Namens beziehen, z. Suit.SPADES.

Sie können über alle Werte iterieren, indem Sie die values ​​() -Methode verwenden und einen der Werte auswählen.

    
starblue 15.09.2009 20:58
quelle