2012-05-19 17 views
7

Ich habe Enum wie dieseJava benutzerdefinierte Enum-Wert ENUM

public enum Sizes { 
    Normal(232), Large(455); 

    private final int _value; 

    Sizes(int value) { 
     _value = value; 
    } 

    public int Value() { 
     return _value; 
    } 
} 

Jetzt kann ich Sizes.Normal.Value() aufrufen Integer-Wert zu erhalten, aber, wie konvertiere ich Integer-Wert zu ENUM zurück?

Was ich tue, ist jetzt:

public Sizes ToSize(int value) { 
    for (Sizes size : Sizes.values()) { 
     if (size.Value() == value) 
      return size; 
    } 
    return null; 
} 

Aber das ist nur so, das zu tun? So funktioniert Java?

+1

möglich Duplikat [Java-Enum-Reverse-Look-Up Best Practice] (http://StackOverflow.com/Questions/5316311/Java-Enum-Reverse-Look-Up-Best-Practice) – bmargulies

Antwort

8

Ja, so wird es gemacht, in der Regel durch Hinzufügen einer statischen Methode zur Enumeration. Denk darüber nach; Sie könnten 10 Felder auf dem Enum haben. Erwarten Sie, dass Java für alle Suchvorgänge eingerichtet wird?

Der Punkt hier ist, dass Java-Enums keinen "Wert" haben. Sie haben Identität und eine Ordnungszahl, plus was auch immer du für dich hinzufügst. Dies unterscheidet sich nur von C#, was folgt, dass C++ stattdessen einen beliebigen ganzzahligen Wert hat.

+2

Ich habe versucht, eine statische setzen HashMap in sein enum, aber es scheint, dass Sie es nicht innerhalb des Enum-Konstruktors ausfüllen dürfen. 1+ –

+0

Nun, ich bevorzuge immer noch, wie C# Enums behandelt. Es ist viel schneller. Enum soll ein ganzzahliger Bezeichner sein, nicht die gesamte Klasse :) – xmen

+0

Möglicherweise müssen Sie ihn in einem statischen Block initialisieren. statische private HashMap Karte = neue HashMap ; und dann puts in den ctor? – bmargulies

1

Es ist eine Weile her, seit ich das letzte Mal mit Java gearbeitet habe, aber wenn ich mich richtig erinnere, gibt es keine Beziehung zwischen Ihrem _value Feld und der Ordnungszahl des Enums. AFAIK können Sie beispielsweise zwei Einträge mit demselben _value haben. Wie @Bmargulies gezeigt hat, könnten Sie viele Felder in der Enumeration haben, und nichts beschränkt Sie bei der Verwendung bestimmter Werte für jede (oder alle) von ihnen.

Siehe auch this related question. Anscheinend können Sie die Ordnungszahl Ihrer Einträge nicht direkt festlegen.

+0

das ist, warum ich fragte, ich dachte, es könnte eingebaute Unterstützung in Java wie C#, aber ich muss alles schreiben. Es ist wie in C++ zu arbeiten lol – xmen