2017-08-03 126 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); 
    } 
} 

狗和猫扩展动物。