I think I agree. While coupling the notion of enhanced swith with that of exhaustiveness has been a good way to define some kind of line between old and new behavior, I think it might perhaps be wiser to enforce exhaustiveness on a more data-dependent way - e.g. what is the type we're switching on? If it's an enum, or a sealed class, I see some value in enforcing some kind of exhaustiveness analysis. But for strings and numbers, it is not clear to me that enforcing exhaustiveness at the statement level makes sense.

Sure, if I define a class that interprets all the JVM bytecodes, I could always forget to handle one of them if my interpreter logic is a big int switch.


But perhaps, in such cases, we would suggest a design where the opcodes are modelled using records implementing a single sealed interface, or some enum (thereby also getting exhaustiveness checks for free) ?


Unfortunately enum is that one case where compatibility dictates that we can't be exhaustive, which is a little sad... but I think that's the best we can do?

Maurizio


On 24/10/2023 23:49, Angelos Bimpoudis wrote:
Hello all!

Yuriy pointed out a valid point.

1) Should we treat float/double/boolean/longs as a new addition to the non-enhanced switch (old switch) and support anything new that comes with that?

or

2) Should we treat those data types equally with all the pre-existing ones?

I am strongly in favour of the 2) for the shake of symmetry and uniformity in what the user will assume, thus I will fix the bug.

What do others think?

------------------------------------------------------------------------
*From:* Yuriy Maslyanko <[email protected]>
*Sent:* 24 October 2023 21:57
*To:* Angelos Bimpoudis <[email protected]>
*Cc:* [email protected] <[email protected]>
*Subject:* JEP 455: Non-enhanced switch statements

Hi Angelos,

Section 14.11.2 of https://cr.openjdk.org/~abimpoudis/instanceof/jep443-20231010/specs/instanceof-jls.html#jls-14.11.2 <https://cr.openjdk.org/~abimpoudis/instanceof/jep443-20231010/specs/instanceof-jls.html#jls-14.11.2> has this note:

For compatibility reasons, |switch| statements that are not enhanced |switch| statements are not required to be exhaustive.

Noticed that if the switch selector statement is float/double/boolean (in this case it’s a non-enhanced switch statement), the code shown below fails with “error: the switch statement does not cover all possible input values”:

    static boolean check = false;

    public static boolean testMethod() {

        double v1 = 1d;

        switch ( v1 ) {

            case 1d:

                check = true;

                break;

        }

        return check;

    }

Reply via email to