You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:07:15