2017-08-03 134 views
0

我想從枚舉類型本身內檢索枚舉類型的名稱:的Java枚舉類型名稱反射

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

    public String alias; 

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

當我如他們,我得到

Main$mammals 
Main$mammals 

但我想

dog 
cat 
+0

你沒有傳遞構造函數的參數,但我可以看到每個枚舉常量都有值。爲什麼? – atiqkhaled

+0

@atiqkhaled對不起,我刪除了一些不必要的代碼,但留下了一些垃圾 – michelemarcon

+1

我不明白爲什麼你需要通過狗實例,如果你不使用或存儲它。有幾個答案已經依賴於'name()'方法,但是如果你需要實例,你只需調用它的'toString'方法?這將使打印依賴於dog/cat實例,而不是枚舉類型名稱。 –

回答

2

您可以使用一個枚舉常量的name()方法來獲得的枚舉常量的名稱:

enum Mammals { 
    DOG(), 
    CAT(); 

    public String alias; 

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

name()方法是什麼,是由編譯器自動上enum類型添加。

+0

從[name']的文檔(https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html#name--):「**大多數程序員應該使用toString()方法優先於此方法,因爲toString方法可能會返回一個更易於用戶使用的名稱。**此方法主要用於特殊情況下,其正確性取決於獲取確切的名稱,從發佈到發佈不會有所不同。「 – Michael

+0

@Michael這意味着name()方法正是您應該使用if你的程序依賴於它;'toString()'返回的東西更適合人類閱讀。 – Jesper

2

請勿使用反射。它不夠健壯。提供一種提供此信息的方法。

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

請您詳細說明爲什麼反射不穩健? – michelemarcon

+0

您正在創建類名與運行時行爲之間的鏈接。餿主意。如果某人稍後出現並重構「Dog」類並將名稱更改爲「Canine」,該怎麼辦?看起來像一個合理的改變 - 它會編譯好。只有幾天,幾周,幾個月後,你會意識到你已經破了一些東西。 – Michael

+2

@Michael儘管我接受你對反射的關注,但如果你只是在尋找名字,你可以使用'name'方法來枚舉枚舉,而不是添加一個帶有「自定義」字符串值的新參數。我的意思是,如果有人重構類,那麼枚舉仍然顯示「狗」值,現在應該是「犬」 –

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

    public String alias; 

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

,或者使用toString(),默認情況下,使用name實現。

0

使用this.getClass()將返回類本身的名稱,這是枚舉哺乳動物在這裏。取而代之的是取一個參數,並在別名的參數上使用getClass。

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

public String alias; 

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

狗和貓擴展動物。