Tengo una interfaz de marcador
public interface Marker{}y dos enumeraciones que implementan el marcador
public enum Sharpie implements Marker{ RED, BLUE, BLACK } public enum Crayola implements Marker{ PURPLE, ORANGE, GREEN }Lo que estoy tratando de hacer es utilizar una declaración de cambio, como
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; } } ¿Hay alguna manera de hacer esto sin usar una costosa instanceof de llamada?
Algo como esto funcionaría, pero estoy tratando de evitar el uso de instanceof y, francamente, se ve un poco feo.
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; } } }Parece un buen escenario para probar la nueva interfaz sellada de funciones de Java y la coincidencia de patrones para cambiar expresiones (* esta es una función de vista previa como en jdk 17)
Primero haga Marker como interfaz sellada
public sealed interface Marker permits Crayola, Sharpie {} Entonces podemos usar la expresión de cambio para deshacernos de esas instanceof de verificación.
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; }Simplemente cambie el switch a if . No hay necesidad de una instanceof de:
public boolean isOwned(Marker m){ if(m == Sharpie.BLUE || m == Sharpie.BLACK || m == Crayola.GREEN) return true; return false; }