2017-07-04 1 views
1

Ich habe Java-Klasse, die alle Konstanten hat, wie unten angegeben:Wie Zugriff auf Konstanten von einer Java-Klasse über andere Variable?

public final class CategoryIDs { 

    public static final String Extraction_of_natural_gas = "1111"; 
    public static final String Mining_of_hard_coal = "2222"; 
    public static final String Mining_of_iron_ores = "3333"; 
    public static final String Mining_of_lignite = "4444"; 

} 

Jetzt will ich diese Konstanten Zugriff auf andere Klasse durch eine Variable, die Namen der Variablen enthält.

Zum Beispiel:

String temp = "Extraction_of_natural_gas"; 

Mit dieser Temp Variable Ich möchte von oben Klasse Konstanten zuzugreifen. Aber ich kann CategoryIDs.temp nicht tun, wie es nicht erlaubt ist. Was ist der beste Weg, dies zu erreichen?

+0

CategoryIDs.yourconstants – Frank

+1

Verwendung 'Map' ich denke – Jerry06

+0

' CategoryIDs.Extraction_of_natural_gas.equals ("1111") ' –

Antwort

5

können Sie Reflexion verwenden es zu extrahieren:

String value = (String) CategoryIDs.class.getField(temp).get(null); 

Das null Argument an get bedeutet dies ist ein statisches Feld, und keine Instanz wird benötigt, um seinen Wert zu erhalten.

Beachten Sie, dass diese Technik sehr fehleranfällig ist. Der obige Code enthält keine Fehlerprüfung oder Ausnahmebehandlung, um das Lesen zu erleichtern, aber eine echte Anwendung sollte sie wahrscheinlich enthalten.

+0

Hey .. Danke für diese Lösung. Das ist etwas Neues, das ich nie benutzt habe. Und ich habe das versucht und es gibt Optionen für die Ausnahmebehandlung. Und es hat für mich funktioniert :) – Madhusudan

7

Wenn Sie wirklich, wirklich, dies mit Ihrer aktuellen Struktur tun müssen, könnten Sie Reflexion verwenden.

Sie können jedoch feststellen, dass eine Enum eine bessere Passform wäre. Etwas wie:

public enum CategoryID { 

    EXTRACTION_OF_NATURAL_GAS("Extraction_of_natural_gas", 1111), 
    MINING_OF_HARD_COAL("Mining_of_hard_coal", 2222), 
    MINING_OF_IRON_ORES("Mining_of_iron_ores", 3333), 
    MINING_OF_LIGNITE("Mining_of_lignite", 4444); 

    private static final Map<String, CategoryID> keyMap; 

    static { 
     keyMap = new HashMap<>(); 
     for (CategoryID category : CategoryID.values()) { 
      keyMap.put(category.getKey(), category); 
     } 
    } 

    private final String key; 
    private final int value; 

    public int getValue() { 
     return value; 
    } 

    public String getKey() { 
     return key; 
    } 

    private CategoryID(String key, int value) { 
     this.key = key; 
     this.value = value; 
    } 

    public static CategoryID fromKey(String key) { 
     return keyMap.get(key); 
    } 
} 

Vorteile dieses Ansatzes:

  • Sie trennen die Namen in dem Code (die für Java jetzt mehr üblich ist) aus dem Schlüssel, den Sie in den Daten zur Verfügung stellen würden. Das bedeutet, dass Sie in den Daten beliebige Schlüssel verwenden können, einschließlich solcher mit Leerzeichen in usw. Sie müssen nicht länger gültige Bezeichner sein.
  • Sie erhalten immer noch Kompilierzeitsicherheit, wenn Sie auf die Enum-Werte aus Code verweisen.
  • Sie erhalten bessere Sicherheit, da Sie nie versehentlich eine Zeichenfolge statt einer Kategorie ID verwenden, die Sie leicht mit Ihren Konstanten hätten tun können.
+0

HI .. Danke für die Lösung. Ich werde prüfen, ob ich in meinem Code enum einfügen kann. :) – Madhusudan

+0

Eigentlich habe ich eine riesige Anzahl von Einträgen zu verarbeiten. Ich versuche eine Eigenschaftendatei zu erstellen. Aber ich exportiere meinen Code in eine Jar-Datei und dort erkennt er den Pfad für die Eigenschaftendatei nicht. So konnte ich nicht gehen. – Madhusudan

+1

@Madhusudan: Ich fürchte, ich verstehe deinen Kommentar wirklich nicht. Was hat das mit JAR-Dateien und -Eigenschaften zu tun? Es ist, als würden Sie auf eine völlig separate Frage antworten ... –

1

Ich denke, dass Sie nach Introspektion suchen. Dies ist der schreibgeschützte Teil der Reflexion, in dem Sie den Wert eines Objekts abrufen können.

Der Code würde wie folgt, für ein leichteres Verständnis pieced:

Object value = null; 
    String constName = "Bar"; 
    Field constant = Foo.class.getField(constName); 

    if (constant != null) { 
     value = constant.get(null); 
    } 

    if (value != null) { 
     System.out.println(value); 
    } else { 
     System.out.println("Constant " + constName + " was not found."); 
    } 

Interessanterweise Sie den Wert aus dem Objekt Feld get() Aufruf zugreifen können, und Sie passieren null weil die Konstante statisch ist, und daher haben Sie keine Instanz, von der der Wert extrahiert werden kann.

Sie können den gesamten Code finden Sie hier: http://ideone.com/v4fcvH

Hoffnung, das hilft.

Verwandte Themen