Skip to content
Advertisement

Utilizing switch statements with enums and marker interface

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;
    }
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement