Utilizing switch statements with enums and marker interface

Viewed 95

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;
       }
    }
}
3 Answers

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;
    }

Just change the switch to if. There is no need for instanceof:

public boolean isOwned(Marker m){
    if(m == Sharpie.BLUE || m == Sharpie.BLACK || m == Crayola.GREEN)
        return true;
    return false;
}

i don't know what are you doing. this example is using unique function for 2 diffrents enum. i think you should use extending in enum like this.

Related