【发布时间】:2021-12-22 18:40:46
【问题描述】:
我有一个标记界面
public interface Marker{}
和两个实现标记的枚举
public enum Sharpie implements Marker{
RED,
BLUE,
BLACK
}
public enum Crayola implements Marker{
PURPLE,
ORANGE,
GREEN
}
我正在尝试做的是利用 switch 语句,例如
public boolean isOwned(Marker m){
// Take in a marker of either Sharpie, or Crayola
switch(m){
case BLUE:
case BLACK:
case GREEN:
return true;
default:
return false;
}
}
有没有办法在不使用昂贵的instanceof 电话的情况下做到这一点?
这样的东西会起作用,但我尽量避免使用instanceof,坦率地说,它看起来有点难看。
public boolean isOwned(Marker m){
// First determine instanceof and then cast the marker
// to the appropriate Type before utilizing the switch statement
if (m instanceof Sharpie){
switch((Sharpie) m){
Case BLUE:
Case BLACK:
return true;
default:
return false;
}
} else {
switch((Crayola) m){
case Green:
return true;
default:
return false;
}
}
}
【问题讨论】:
-
也许不要让你的界面成为一个标记。使其公开一个
isOwned()API 方法,该方法将由您的枚举实现。这样一来,您就可以完全摆脱switch。 -
不幸的是,这个想法是不同的标记将由不同的“人”拥有。该信息将由个人“人”确定。也许,更好的名称是
doesOwn(),因为不同的实例将拥有不同的标记。让枚举实现这个方法是不允许的。 -
不过,您可以使用
Marker使枚举在所有实现中公开唯一值。例如,如果每个枚举都可以公开一个String getUniqueColor()方法,那么您的外部isOwned()方法甚至可以使用switch,而无需依赖于Marker参数的运行时类型。 -
@user16320675 的建议也是我所期望的实现方式:让每个人都拥有一个
Set<Marker>,然后使用contains()。或者,要实现您当前拥有的逻辑,您可以使用静态Map<Marker, Boolean>并使用它来查找返回值。
标签: java enums switch-statement