2017-08-03 5 views
0

Ich möchte aus dem Aufzählungstyp den Namen des Aufzählungstyp abzurufen selbst:Java Enum-Typ Name Reflexion

enum Mammals { 
    DOG(new Dog()), 
    CAT(new Cat()); 

    public String alias; 

    Mammals(AncestorOfDogAndCat a){ 
     this.alias=this.getClass().getName().toLowerCase(); 
     System.out.println(alias); 
    } 
} 

Als ich ihnen Instanz ich

Main$mammals 
Main$mammals 

bekommen, aber ich will

dog 
cat 
+0

Sie übergeben Parameter nicht auf Konstruktor, aber ich kann sehen, dass jede Enum-Konstante Werte hat. Warum? – atiqkhaled

+0

@atiqkhaled Entschuldigung, ich habe überflüssigen Code entfernt, aber etwas Müll hinterlassen. – michelemarcon

+1

Ich verstehe nicht, warum Sie die Dog-Instanz übergeben müssen, wenn Sie sie nicht verwenden oder speichern. Es gibt mehrere Antworten, die sich bereits auf die 'name() 'Methode stützen, aber wenn Sie die Instanz brauchen, rufen Sie nicht einfach ihre' toString' Methode auf? Dies würde den Druck abhängig von der Hund/Katze-Instanz anstelle des Namens des Aufzählungstyps machen. –

Antwort

2

können Sie die name() Methode auf eine Enumeration Konstante verwenden den Namen der Enumeration Konstante zu erhalten:

enum Mammals { 
    DOG(), 
    CAT(); 

    public String alias; 

    Mammals() { 
     this.alias = name().toLowerCase(); 
     System.out.println(alias); 
    } 
} 

Die name() Methode ist etwas, das automatisch durch den Compiler auf enum Typen hinzugefügt wird.

+0

Aus [die Dokumentation für 'name'] (https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html#name--):" ** Die meisten Programmierer sollten die verwenden toString() -Methode gegenüber dieser Methode, da die toString-Methode möglicherweise einen benutzerfreundlicheren Namen zurückgibt.** Diese Methode wurde in erster Linie für den Einsatz in speziellen Situationen entwickelt, in denen die Korrektheit vom genauen Namen abhängt. " – Michael

+0

@Michael, was bedeutet, dass die' name() 'Methode genau das ist, was Sie verwenden sollten Ihr Programm hängt davon ab, was 'toString()' zurückgibt, ist eher für Menschen gedacht. – Jesper

2

Keine Reflexion verwenden. Es ist nicht robust genug. Stellen Sie eine Methode bereit, die diese Informationen bereitstellt.

interface Animal 
{ 
    String getName(); 
} 

class Dog implements Animal 
{ 
    public String getName() 
    { 
     return "dog"; 
    } 
} 

enum Mammals { 
    DOG(new Dog()), 
    CAT(new Cat()); 

    public String alias; 

    Mammals (Animal animal) { 
     this.alias = animal.getName(); 
     System.out.println(alias); 
    } 
} 
+0

Könnten Sie bitte erläutern, warum die Reflexion nicht robust ist? – michelemarcon

+0

Sie erstellen eine Verknüpfung zwischen dem Klassennamen und dem Laufzeitverhalten. Schlechte Idee. Was ist, wenn jemand später kommt und die 'Dog' Klasse umgestuft und den Namen in' Canine' ändert? Scheint wie eine vernünftige Änderung - es wird gut kompilieren. Nur Tage, Wochen, Monate später werden Sie feststellen, dass Sie etwas kaputt gemacht haben. – Michael

+2

@Michael, obwohl ich Ihre Bedenken bezüglich der Reflexion akzeptiere, wenn Sie nur nach dem Namen suchen, können Sie die Methode 'name' für Enums verwenden, anstatt einen neuen Parameter mit einem" benutzerdefinierten "Zeichenfolgenwert hinzuzufügen. Ich meine, mit dem gleichen Argument, wenn jemand die Klasse umstellt, zeigt die Enum immer noch den "Hund" -Wert und es sollte jetzt "Hund" sein. –

0
enum Mammals { 
    DOG(new Dog()), 
    CAT(new Cat()); 

    public String alias; 

    Mammals(DogOrCat value){ 
     this.alias=name().toLowerCase(); 
     System.out.println(alias); 
    } 
} 

oder toString() verwenden, die standardmäßig name realisiert wird.

0

Mit this.getClass() wird der Name der Klasse selbst zurückgegeben, die hier die Enum Mammals ist. Stattdessen nehmen Sie einen Parameter und verwenden Sie getClass für den Parameter für Ihren Alias.

wo Hund und Katze Tier verlängern.

Verwandte Themen