如何对实现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接口增加通用方法,避免类型判断:
- 修改Marker接口,新增通用方法定义:
public interface Marker{ String getColorIdentifier(); }
- 两个枚举类实现该接口,直接返回枚举名即可:
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(); } }
- 最终判断逻辑直接对通用返回值做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
相关产品推荐
相关产品推荐

