繁体   English   中英

Java:抽象枚举常量

[英]Java: abstract enum constant

有没有办法将抽象枚举声明为函数参数? 我想要实现的是:

interface EnumInterpreterInterface {
   String getStringValue(**abstract enum constant** e);
}

interface EnumProviderInterface {
    //classes implementing this interface will hold at least one enum
    Enum getEnum();
}

class EnumProvider implements EnumProviderInterface {
    enum Numbers {ONE, TWO, THREE};
}

class EnumInterpreter implements EnumInterpreterInterface {
   String getStringValue(EnumProvider.Numbers n) {
       switch(e) {
           case EnumProvider.Numbers.ONE: return "one";
           case EnumProvider.Numbers.TWO: return "two";
           default: return "three";
       }
   }
}

如果您想要的是抽象枚举,则可以执行以下操作:

interface EnumInterpreterInterface {
    String getStringValue(Enum<?> e);
}

由于Enum是抽象类,因此可以用作任何类。

但是必须注意实现,请考虑此类:

class EnumInterpreter implements EnumInterpreterInterface { code }

然后将像这样实现getStringValue:

String getStringValue(Enum n) 
{
   if(n instanceof EnumProvider.Numbers)
   {
       EnumProvider.Numbers e=(EnumProvider.Numbers)n;
       switch(e) {
            case ONE: return "one";
            case TWO: return "two";
            default: return "three";
       }
   }
   else //do something, maybe return null or throw an exception
}

请注意,您不能将签名更改为此String getStringValue(EnumProvider.Numbers n)因为编译器会抱怨(但如果枚举是返回值,它就不会抱怨)。

而且由于我们不能在签名中限制Enum类型,因此必须使用instanceof和cast进行检查。

注意

Java枚举中的类是类,因此上面的代码起作用。 但是,对于其他情况可能并非如此(例如,C#,C ++中的枚举由整数表示),据我所知,没有任何方法可以执行此操作:)。

尚不清楚,如果我错了,请纠正我,但是通过您提供的switch语句,我假设您会想要像使用附加数据进行枚举之类的事情。

这是一个例子:

enum Numbers {

    ZERO("numbers.zero"), ONE("numbers.one"), TWO("numbers.two");

    private String key;

    private Numbers(String key) {
        this.key = key;
    }

    public String getKey() {
        return key;
    }
}

对于枚举,每个值都是枚举的一个实例,因此每个实例可能具有在枚举构造函数中提供的不同的其他属性。

这是您检索其他数据的方式:

System.out.println(Numbers.ZERO.getKey());

您甚至可以在资源包文件中具有匹配的密钥以进行本地化。

这是教程和有关枚举的有趣文章的参考。

暂无
暂无

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

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