我有一个标记接口
public interface Marker{}
还有两个实现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
。 - ernest_kdoesOwn()
,因为不同的实例将拥有不同的标记。 如果枚举实现此方法,则无法实现此目的。 - user15708369Set<Marker>
,然后使用contains()
。或者,为了实现您当前拥有的逻辑,您可以只使用静态的Map<Marker, Boolean>
,并使用它来查找返回值。 - Robby Cornelissen