2013-10-03 9 views
6

Angenommen, Sie haben die folgende Enum:Java - Enum valueOf „überschreiben“ Namenskonvention

public enum Color { 
    RED("R"), GREEN("G"), BLUE("B"); 
    private String shortName; 

    private Color(String shortName) { 
     this.shortName = shortName; 
    } 

    public static Color getColorByName(String shortName) { 
     for (Color color : Color.values()) { 
      if (color.shortName.equals(shortName)) { 
       return color; 
      } 
     } 
     throw new IllegalArgumentException("Illegal color name: " + shortName); 
    } 
} 

Da ENUM ist ein Sonderfall, wenn Sie nicht nur die valueOf Funktion außer Kraft setzen kann, was ist die Namenskonvention für dies umgehen und valueOf (String name) implementieren?

getColorByName(String name) 
getValueOf(String name) 
permissiveValueOf(String name) 
customValueOf(String name) 
forName(String name) 
getEnum(String name) 
getColor(String name) 

Später Edit: Ich sehe, dass Bloch in Effective Java 2nd ed. schlägt etwas in den Zeilen von getInstance() vor (Kapitel 1, Punkt 1). Nur um eine weitere Option hinzuzufügen.

+5

http://en.wikipedia.org/wiki/Method_overriding#Java Übergeordnete Methode hält den Namen. –

+0

Auch Überladung behält den gleichen Namen, aber variiert die Signatur. Das klingt, als würden wir über ganz andere Namen sprechen ... –

+5

Jungs ... wir sprechen über Enums. Sie können valueOf() und values ​​() nicht überschreiben. Ich werde den Titel ändern, um darauf hinzuweisen. Aber bitte entferne deine Stimmen und gib mir eine Antwort. –

Antwort

13

Sie haben definitiv Recht, Sie können Enum#valueOf() nicht überschreiben, da es eine statische Methode der Enum Klasse ist.

Ich glaube nicht, dass es eine Namenskonvention gibt. Wie Sie bereits darauf hingewiesen haben, gibt es nur wenige Beispiele in Java:

ich nicht getEnum verwenden, werden, da Sie nicht die Enum selbst bekommen, sondern ein Wert. Mit forName() ist hier nicht geeignet, R ist nicht der Name der roten Farbe.

Ich würde eher gehen mit:

  • fromString() da es sich um ein gegenüber toString() ist;
  • getColor() für Konsistenz mit Java-Standardbibliothek.
+0

Das Problem ist, dass ich keine Beispiele in der Java-Spezifikation eines Enum finden konnte. Farbe und Klasse sind Klassen und keine Enums. Sie könnten also auch eine valueOf-Methode hinzufügen, aber Sie können keinen Schalter (Farbe) –

+0

"vonBlah" macht Sinn für mich. Siehe zum Beispiel 'Response.Status.fromStatusCode'. – jtoberon

+0

Es gibt keinen Standard und es ist nicht sehr üblich, so dass Sie wahrscheinlich auch keine starke Konvention finden werden. Es sei denn, Sie möchten mit cglib (!) FromString herumspielen, ist wahrscheinlich das Beste. Sicherlich wird niemand verwirrt sein, wenn sie es lesen. –

1

würde ich das Paar verwenden:

Color fromValue(String value) 
String toValue() 

Das ist etwas, das ich am besten geeignet in meinen Aufzählungen gefunden habe.

2

Beachten Sie auch Folgendes!

Color fromName(String name); 
Color fromShortName(String shortName); 
Color fromCode(String code);