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

如何对实现Marker接口的枚举类直接使用switch语句,避免instanceof判断

方案1:Java 17+ 模式匹配switch(最贴近你想要的写法)

Java 17及更高版本支持switch类型模式匹配,编译器会自动完成类型校验和隐式类型转换,完全不需要手动写instanceof和强转逻辑,代码如下:

public boolean isOwned(Marker m) {
    return switch (m) {
        case Sharpie.BLUE, Sharpie.BLACK, Crayola.GREEN -> true;
        case null -> false; // 可根据需求调整空值处理逻辑
        default -> false;
    };
}

该写法编译时会自动校验覆盖的枚举常量合法性,后续新增Marker实现时编译器也会给出缺失分支提示,维护成本很低。

方案2:低版本Java兼容方案

如果使用的Java版本低于17,可以给Marker接口增加通用方法,避免类型判断:

  1. 修改Marker接口,新增通用方法定义:
public interface Marker{
    String getColorIdentifier();
}
  1. 两个枚举类实现该接口,直接返回枚举名即可:
public enum Sharpie implements Marker{
    RED,
    BLUE,
    BLACK;

    @Override
    public String getColorIdentifier() {
        return name();
    }
}

public enum Crayola implements Marker{
    PURPLE,
    ORANGE,
    GREEN;

    @Override
    public String getColorIdentifier() {
        return name();
    }
}
  1. 最终判断逻辑直接对通用返回值做switch即可:
public boolean isOwned(Marker m){
    if (m == null) {
        return false;
    }
    switch (m.getColorIdentifier()) {
        case "BLUE":
        case "BLACK":
        case "GREEN":
            return true;
        default:
            return false;
    }
}

方案3:预存持有集合(性能最高、扩展性最好)

如果后续会新增更多颜色或Marker实现,推荐直接用Set预存所有已持有的Marker实例,一行代码就能完成判断,完全不需要switch和instanceof:

// 全局预存已持有的颜色实例
private static final Set<Marker> OWNED_COLORS = Set.of(
    Sharpie.BLUE,
    Sharpie.BLACK,
    Crayola.GREEN
);

public boolean isOwned(Marker m){
    return OWNED_COLORS.contains(m);
}

该方案时间复杂度为O(1),后续新增持有颜色只需要修改OWNED_COLORS集合即可,不需要调整判断逻辑,维护成本最低。

内容的提问来源于stack exchange,提问作者user15708369

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:45:10