简体   繁体   English

如何从变量获取枚举类?

[英]How can I get the enum class from a variable?

Best explained in code. 最好用代码解释。

I have something like this 我有这样的东西

public enum MyEnum implements MyEnumInterface { 
   A,
   B,
   C
}

public enum MyOtherEnum implements MyEnumInterface { 
   AA,
   BB,
   CC
}

and somewhere else 还有其他地方

public void doSomething(MyEnumInterface anEnum, ... ) {
   ... 
   // doSomething 
   ... 
}

I would like to find out what class anEnum comes from (eg MyEnum or MyOtherEnum). 我想找出anEnum来自什么类(例如MyEnum或MyOtherEnum)。

How can I do that? 我怎样才能做到这一点? (without doing an instanceof check for all possible implementations :) ) (不检查所有可能的实现的instanceof :)

You need to call .getDeclaringClass() on the enum value to get the class. 您需要在枚举值上调用.getDeclaringClass()以获取类。 But I think you are in search of the Visitor Pattern : 但我认为您正在寻找访客模式

public class Example implements Visitor {

    public static void main(String[] args) {
        Example example = new Example();
        example.doSomething(MyEnum.A);
        example.doSomething(MyOtherEnum.BB);
    }

    public void doSomething(MyEnumInterface anEnum) {
        anEnum.visit(this);
    }

    @Override public void visit(MyEnum my) {
        System.out.println("MyEnum: " + my);
    }

    @Override public void visit(MyOtherEnum my) {
        System.out.println("MyOtherEnum: " + my);
    }
}

interface Visitor {

    public void visit(MyEnum my);

    public void visit(MyOtherEnum my);
}

interface MyEnumInterface {
    public void visit(Visitor visitor);
}

enum MyEnum implements MyEnumInterface { 
    A,
    B,
    C;

    @Override public void visit(Visitor visitor) {
        visitor.visit(this);
    }
 }

 enum MyOtherEnum implements MyEnumInterface { 
    AA,
    BB,
    CC;

    @Override public void visit(Visitor visitor) {
        visitor.visit(this);
    }
}    

This is the answer to your comment: 这是您的评论的答案:

public static void main(String[] args) {
    System.out.println(MyEnum.A.getDeclaringClass());
}

OUTPUT: OUTPUT:

class MyEnum

You can do it by accessing its class object: 您可以通过访问其类对象来做到这一点:

System.out.println(anEnum.getDeclaringClass().getName());

Note that getDeclaringClass() is critically different from getClass() when each value has a custom class body. 请注意,当每个值都有一个自定义类主体时, getDeclaringClass()getClass()不同。 More information 更多信息

Enums are also classes so use 枚举也是类,所以使用

if(anEnum instanceof MyEnum) {...}

and

if(anEnum instanceof MyOtherEnum) {...}

您可以使用instanceof运算符来确定对象的类型

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM