New JEP: Switch Expressions for the Java Language
Brian Goetz
brian.goetz at oracle.com
Mon Dec 18 21:25:15 UTC 2017
On 12/18/2017 4:16 PM, Kevin Bourrillion wrote:
> On Mon, Dec 11, 2017 at 11:28 AM, Brian Goetz <brian.goetz at oracle.com
> <mailto:brian.goetz at oracle.com>> wrote:
>
>> I think most of my questions surround how these changes will (or
>> /should/) affect non-expression switches.
>>
>> * Should we retcon `case A, B:` onto regular switches, with the
>> same semantics?
>>
> Absolutely; I thought this was already present in the JEP, but if
> not, I'll clarify.
>
>> * Should we retcon `case null:` onto regular switches, with the
>> same semantics?
>>
> Absolutely; same comment.
>
>
> There is a problem here, especially among users who learn Java in the
> future and never know how `switch` used to work.
> They will know that `null` is a valid thing to switch on, and when
> they don't see `case null` they will assume that the `default` clause
> is being executed. That's unfortunate.
>
Why would they assume that? What they'll learn in future Java school is
"If there's no explicit case null, switch throws NPE". Which is exactly
as it is today -- except that you can't spell "case null". In no case
will a switch without a "case null" execute the default clause on null
input.
> Now whenever we want null handled the default way we're going to have
> to do this:
>
> case null:
> default:
> codeHere();
Right. This seems pretty clean to me -- if you want null lumped into
default, you say so, and its clear. Otherwise you get the default null
treatment.
> This isn't an absolute deal-breaker, but I could use a refresher on
> what the positive value of allowing `case null` is at all. The word
> "null" does not appear in the current pattern matching doc.
Same answer as with floats: nested patterns and composibility.
Suppose I have a class Box<T>, which is a one-element collection, and
let's say a Box can contain null. (Nulls are reasonable, if tricky
values for domain classes.) I want to be able to say:
case Box(null): ...
which is a nested pattern that means:
case Box(\alpha) where \alpha matches null:
which brings us back to: everything is cleaner if null is a just
constant pattern that can be matched. At which point, it just seems a
little mean to have null be a pattern but *not* be able to say:
case null:
in a switch at top level. Especially because you should be allowed to
refactor:
case Box(null): A
case Box(String s): B;
case Box(Frogs fs): C;
into
case Box(var x):
switch (x) {
case null: A
case String s: B;
case Frogs fs: C;
}
if that seems beneficial.
More information about the amber-spec-observers
mailing list