如何强制Java枚举实现类包含指定枚举常量ONE和TWO?
关于枚举类强制包含特定常量的解决方案
核心问题:普通接口没法强制枚举有特定常量
Java接口只能约束方法签名,管不了枚举类必须包含哪些具体的枚举实例(比如ONE、TWO)——毕竟枚举常量是类的实例,接口没权限规定实现类必须存在哪些实例。
两种可行的替代实现方式
1. 接口定义获取常量的方法,枚举类实现
先写一个Type接口,要求实现类提供获取ONE、TWO实例的方法,同时包含getName():
public interface Type { String getName(); Type getOne(); Type getTwo(); }
然后让枚举类实现这个接口,返回自身的ONE、TWO常量:
public enum Type_A implements Type { ONE("OneA"), TWO("TwoA"); private final String name; Type_A(String name) { this.name = name; } @Override public String getName() { return this.name; } @Override public Type getOne() { return ONE; } @Override public Type getTwo() { return TWO; } }
这样用Type类型引用时,就能通过getOne().getName()、getTwo().getName()拿到对应的值。
2. 用默认方法间接强制常量存在
如果想更贴近“必须有ONE、TWO”的约束,可以在接口里写默认方法,借助Enum.valueOf()来获取指定名称的常量:
public interface Type { String getName(); default Type getOne() { return Enum.valueOf((Class<? extends Enum>) this.getClass(), "ONE"); } default Type getTwo() { return Enum.valueOf((Class<? extends Enum>) this.getClass(), "TWO"); } }
枚举类只需要实现getName(),但必须保证自己有ONE、TWO这两个常量:
public enum Type_B implements Type { ONE("OneB"), TWO("TwoB"); private final String name; Type_B(String name) { this.name = name; } @Override public String getName() { return this.name; } }
要是枚举类没定义ONE或TWO,调用getOne()的时候会直接抛IllegalArgumentException,相当于间接强制必须包含这些常量。
不存在专门的“枚举特定接口”
Java标准库没有专门用来约束枚举常量的接口,上面两种方案是业内常用的替代方式,完全能满足你通过Type类型调用ONE、TWO的getName()方法的需求。
内容的提问来源于stack exchange,提问作者Big Guy
相关产品推荐
相关产品推荐

