I’ve got a marker interface
public interface Marker{}
and two enums which implement the Marker
public enum Sharpie implements Marker{ RED, BLUE, BLACK } public enum Crayola implements Marker{ PURPLE, ORANGE, GREEN }
What I’m trying to do is utilize a switch statement, such as
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; } }
Is there a way to do this without using an expensive instanceof
call?
Something like this would work, but I’m trying to avoid using instanceof
, and frankly it looks kind of ugly.
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; } } }
Advertisement
Answer
Looks like a good scenario to try new Java Feature Sealed Interface and Pattern Matching for switch Expressions(* this is a preview feature as at jdk 17)
First make Marker
as sealed interface
public sealed interface Marker permits Crayola, Sharpie {}
Then we can use switch expression to get rid of those instanceof
checking.
public boolean isOwned(Marker marker) { boolean isOwned = switch (marker) { case Sharpie s -> s == Sharpie.BLACK || s == Sharpie.BLUE; case Crayola c -> c == Crayola.GREEN; }; return isOwned; }