default branch placement in switch
Brian Goetz
brian.goetz at oracle.com
Sun Nov 12 17:38:47 UTC 2017
Agree except: the terminology of domination is backwards. Default/_ dominates everything; most things dominate null. (Null is unordered w respect to other constant patterns and primitive type test patterns, though).
Sent from my MacBook Wheel
> On Nov 11, 2017, at 11:54 PM, Remi Forax <forax at univ-mlv.fr> wrote:
>
> I prefer default to be special and has to be at the end thus starts warning about default not being at the end.
> I think case null should be special too, for the same reason, case null dominates every cases while default dominates none.
>
> Rémi
>
> ----- Mail original -----
>> De: "Brian Goetz" <brian.goetz at oracle.com>
>> À: "Tagir Valeev" <amaembo at gmail.com>, "amber-spec-experts" <amber-spec-experts at openjdk.java.net>
>> Envoyé: Vendredi 3 Novembre 2017 22:25:18
>> Objet: Re: default branch placement in switch
>
>> Yeah, this has to change. In existing switches, there are no case
>> labels other than default, so order is irrelevant. But now that
>> patterns have overlapping match-sets, default should be considered to
>> dominate other cases, so it should go last.
>>
>> Compatibility-wise, we have two choices for how to get there; carve out
>> a permanent exception for switches where all cases are type-restating
>> constant patterns, or plan to eventually get to a place where default
>> always comes last, even for "int" switches. If we want to get to the
>> latter, we should start warning on this construct now.
>>
>>
>>
>>> On 11/3/2017 5:10 PM, Tagir Valeev wrote:
>>> Hello!
>>>
>>> Currently the default branch can be placed in any place inside the
>>> switch operator, e.g. like this:
>>>
>>> switch(i) {
>>> case 1: System.out.println("one");break;
>>> default: System.out.println("other");break;
>>> case 2: System.out.println("two");break;
>>> }
>>>
>>> In this case behavior does not change on the order of case blocks.
>>> However in pattern matching the order of cases usually matters: if
>>> some pattern matches, this means that the subsequent patterns will not
>>> be checked. Does this mean that with pattern matching the default
>>> branch makes all the subsequent case blocks unreachable? Or default
>>> can still be located anywhere and is checked only after any other
>>> pattern?
>>>
>>> With best regards,
>>> Tagir Valeev
More information about the amber-spec-experts
mailing list