Tengo un método simple que toma una enumeración y devuelve una cadena:
public static String enumToString(MyEnum type) { return switch (type) { case Enum1 -> "String_1"; case Enum2 -> "String_2"; case Enum3 -> "String_3"; case Enum4 -> "String_4"; case Enum5 -> "String_5"; case Enum6 -> "String_6"; default -> null; }; }Pero Sonar me da este error importante: los parámetros de método no utilizados deben eliminarse .
como puede ver, el tipo de parámetro se usa en el interruptor. Para obtener más detalles, cuando uso la caja del interruptor anterior, todo está bien.
¿Alguna idea sobre el problema? ¿El sonar cubre nuevas sintaxis de Java?
Hmm, me doy cuenta de que cuando elimino default -> null; paso de sonar correctamente! esto es raro
public static String enumToString(MyEnum type) { return switch (type) { case Enum1 -> "String_1"; case Enum2 -> "String_2"; case Enum3 -> "String_3"; case Enum4 -> "String_4"; case Enum5 -> "String_5"; case Enum6 -> "String_6"; //default -> null; }; }Esto no es un error, Sonar evalúa correctamente que si la lista es exhaustiva , la expresión de cambio nunca puede caer en la rama default .
Por otro lado, si decide no enumerar todas las posibles constantes de enumeración, la rama default , sin embargo, debe declararse. De lo contrario, el código no sería compilable debido al requisito de que cada constante de enumeración pueda coincidir.
Nota: Su código contiene una expresión de cambio, no una declaración de cambio.
Técnicamente, la sintaxis default -> null; no es un "parámetro". El JLS se refiere a varios componentes dentro de un bloque de interruptores como una "regla", "etiqueta" o "expresión"; mientras que la JEP pertinente también utiliza el término “cláusula”.
Independientemente de cómo llame a sus componentes, las Expresiones de cambio son distintas de las Declaraciones de cambio más antiguas. En particular, las expresiones de cambio son exhaustivas .
de la JEP,
Agotamiento
Los casos de una expresión de cambio deben ser exhaustivos ; para todos los valores posibles debe haber una etiqueta de interruptor coincidente. (Obviamente, no se requiere que las declaraciones de cambio sean exhaustivas).
En la práctica, esto normalmente significa que se requiere una cláusula por defecto; sin embargo, en el caso de una expresión de
enum switchde enumeración que cubre todas las constantes conocidas, el compilador inserta una cláusula predeterminada para indicar que la definición de enumeración ha cambiado entre el tiempo de compilación y el tiempo de ejecución. Confiar en esta inserción de cláusula predeterminada implícita hace que el código sea más robusto; ahora, cuando se vuelve a compilar el código, el compilador verifica que todos los casos se manejen explícitamente. Si el desarrollador hubiera insertado una cláusula predeterminada explícita (como es el caso hoy), se habría ocultado un posible error.
Sonar es lo suficientemente inteligente como para saber cuándo están cubiertas todas las bases, lo que hace que una cláusula predeterminada no solo sea inalcanzable, sino que interfiere con el comportamiento descrito anteriormente.