Call for feedback -- switch expressions in JDK 12

Stephan Herrmann stephan.herrmann at berlin.de
Sun Apr 28 11:37:27 UTC 2019


Brian,

let me try to help
(I'm not on jdk-dev, so this may not make it to the list, feel free to forward).

I had discussions about this with Manoj, and the focus was on "->" inside a 
switch *statement*. No question about switch expressions, here.


In the recent past we stumbled on several issues with this combination, and we 
started to wonder, whether this particular combination carries its own weight:

(1) Spec is complex (buggy), where it defines different rules of definite 
assignments for switch statements/expressions with ":" / "->".

(2) We have issues naming this thing, e.g., in compiler messages. Even JEP 325 & 
JEP 354 don't have a name for it but put the horse (syntax) before the cart 
(concept) by speaking of the "case L ->" switch label. The grammar term 
SwitchLabeledRule doesn't seem to be suitable for user-facing messages and 
explanations, either.

(3) The recent proposal of admitting break-with in more contexts would create 
new confusion if the following were admitted:

//---
int result = switch (in1) {
     case 0 -> {
             switch (in2) {
                   case 0 -> break-with 13; // line 4
                   default -> System.out.println("default");
             }
             break-with 14;
         }
     default -> 42;
};
//---

Just from looking at line 4 users would surely, but incorrectly assume that we 
are breaking from the inner switch. IOW, "case 0 -> break-with 13;" within a 
switch statement looks particularly hazardous to me.

Other related concepts that don't exactly align with switch statement with ->:
- lambdas can be void compatible and/or value compatible.
   This concept *could* be applied to switch also, but isn't.
- we already have the concept of ExpressionStatement/StatementExpression,
   for things that swing both ways, but switch does not participate in this, either.

IMHO, these are several bad smells, all caused by the same combination of 
constructs, so we were asking what benefits would possibly outweigh those bad 
smells.

Yet another way of asking: to what degree are switch statement and switch 
expression (intended to be) the same animal, or disjoint concepts?

best,
Stephan

On 28.04.19 00:56, Brian Goetz wrote:
> I’m not sure whether you’re asking about the specific overloading of -> (some people find it disturbing that both switch and lambda use the same punctuation; others see a switch as a sort of “function by parts” and the arrow makes sense to them), or about why there was a need to have a shorthand form at all.
> 
> We surely could have done this:
> 
>       case A: break-with 1;
>       case B: break-with 2;
>> 
> And that might have been a reasonable idea, though people seem to have such an allergy to “break” in switch that the convenience factor was significant.
> 
> 
>> One more item in the feedback list:
>>
>> We understand that the "->" in switch expressions lends itself to future
>> pattern matching constructs, but is there a real need for "->" to be there
>> in switch statements as well other than the convenience factor of avoiding
>> break ( or rather making the break implicit)  in switch statements?
>>
>> Regards,
>> Manoj
>>
>>
>>
>> From:	"Manoj Palat" <manoj.palat at in.ibm.com>
>> To:	"Alex Buckley" <alex.buckley at oracle.com>
>> Cc:	Stephan Herrmann <stephan.herrmann at berlin.de>,
>>             jdk-dev at openjdk.java.net
>> Date:	04/19/2019 03:28 AM
>> Subject:	Re: Call for feedback -- switch expressions in JDK 12
>> Sent by:	"jdk-dev" <jdk-dev-bounces at openjdk.java.net>
>>
>>
>>
>>
>> Hi Alex,
>> Please find our feedback from Eclipse Java Dev.
>>
>>    1)		 For the break expression part we would be happy to have the
>>       “overloading” of break replaced by something else ? since this is
>>       already in the cards, no additional comment on this part.
>>
>>    2)		 Thanks to Remi Forax raising a bug in ecj [
>>
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__bugs.eclipse.org_bugs_show-5Fbug.cgi-3Fid-3D545716&d=DwIFJg&c=jf_iaSHvJObTbx-siA1ZOg&r=A51zLdywEjS50U7u2UMWvsDIrUGEJ5IDXskL5MxIEjA&m=kii1fGYS4Td8yanneEhpKyvY68-2ZuWy6UGnDArvEtU&s=bTz3kPNJIWSaFf9MBqxF1ZKUwUHxpH0AJkS2Noth9O0&e=
>> ] and the
>>       following discussions, we believe that there could be a bug [in spec,
>>       javac as well as ecj] ? see this comment from Stephan Herrmann
>>
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__bugs.eclipse.org_bugs_show-5Fbug.cgi-3Fid-3D545716-23c16&d=DwIFJg&c=jf_iaSHvJObTbx-siA1ZOg&r=A51zLdywEjS50U7u2UMWvsDIrUGEJ5IDXskL5MxIEjA&m=kii1fGYS4Td8yanneEhpKyvY68-2ZuWy6UGnDArvEtU&s=lp0V33xF-hHx6PbOuSpmziGYZGad42PPROmWzFvu8xQ&e=
>> specifically
>>       for the findings. [@Alex: I am taking the liberty of pointing to the
>>       bug link rather than summarizing here since you have mentioned that a
>>       blog pointer should also be fine]
>>
>>    Regards,
>>
>>    Manoj
>>
>>    Eclipse Java Dev, IBM
>>
>>
>>
>>
>> From:		 Alex Buckley <alex.buckley at oracle.com>
>> To:		 jdk-dev at openjdk.java.net
>> Date:		 04/17/2019 11:23 PM
>> Subject:		 Re: Call for feedback -- switch expressions in JDK 12
>> Sent by:		 "jdk-dev" <jdk-dev-bounces at openjdk.java.net>
>>
>>
>>
>> The feedback we're looking for is "I tried switch expressions in my code
>> and observed ...". For example:
>>
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__mail.openjdk.java.net_pipermail_amber-2Ddev_2019-2DMarch_004199.html&d=DwIFaQ&c=jf_iaSHvJObTbx-siA1ZOg&r=A51zLdywEjS50U7u2UMWvsDIrUGEJ5IDXskL5MxIEjA&m=yINx0-noxNSSsm-dLx2P9YD7dvF6187FW7CStT07mp4&s=9at0fZB0bQpeEPI5L2IWbMSlUqcdgEsfF5944Rfjaxo&e=
>>
>>
>>
>> If anyone is blogging about their experience with switch expressions,
>> feel free to share the URL here. For example, here's a great writeup of
>> using switch expressions in lambdas:
>>
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__minborgsjavapot.blogspot.com_2019_03_java-2D12-2Dmapping-2Dwith-2Dswitch-2Dexpressions.html&d=DwIFaQ&c=jf_iaSHvJObTbx-siA1ZOg&r=A51zLdywEjS50U7u2UMWvsDIrUGEJ5IDXskL5MxIEjA&m=yINx0-noxNSSsm-dLx2P9YD7dvF6187FW7CStT07mp4&s=JE0ESlf3gLQJ5-QzuOU1uR_xMLngiysxuz0o948ZlW4&e=
>>
>>
>>
>> Alex
>>
>> On 4/16/2019 8:24 PM, Netroby wrote:
>>>     int numLetters = switch (day) {
>>>         case MONDAY, FRIDAY, SUNDAY -> 6,
>>>         case TUESDAY                -> 7,
>>>         case THURSDAY, SATURDAY     -> 8,
>>>         case WEDNESDAY              -> 9,
>>>         _ -> 0,
>>>     };
>>>
>>> Should we using  comma , instead of ;
>>>
>>> comma , means these cases the same switch.
>>>
>>> Another point, should we have an default match pattern ? using _ or
>> default
>>>
>>>
>>> idea from rust match
>>> ```rust
>>> fn main() {
>>>      let number = 13;
>>>      // TODO ^ Try different values for `number`
>>>
>>>      println!("Tell me about {}", number);
>>>      match number {
>>>          // Match a single value
>>>          1 => println!("One!"),
>>>          // Match several values
>>>          2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
>>>          // Match an inclusive range
>>>          13...19 => println!("A teen"),
>>>          // Handle the rest of cases
>>>          _ => println!("Ain't special"),
>>>      }
>>>
>>>      let boolean = true;
>>>      // Match is an expression too
>>>      let binary = match boolean {
>>>          // The arms of a match must cover all the possible values
>>>          false => 0,
>>>          true => 1,
>>>          // TODO ^ Try commenting out one of these arms
>>>      };
>>>
>>>      println!("{} -> {}", boolean, binary);
>>> }
>>>
>>> ```
>>>
>>> Appreciate your time.
>>> ----------------------------
>>> Netroby
>>>
>>> Alex Buckley <alex.buckley at oracle.com> 于2019年4月17日周三 上午10:00写
>> 道:
>>>>
>>>> An easy way to help move Java forward is to try out new features on real
>>>> code and share your experiences. We're asking for feedback on how you
>>>> use switch expressions, the new language feature in JDK 12:
>>>>
>>>>     int numLetters = switch (day) {
>>>>         case MONDAY, FRIDAY, SUNDAY -> 6;
>>>>         case TUESDAY                -> 7;
>>>>         case THURSDAY, SATURDAY     -> 8;
>>>>         case WEDNESDAY              -> 9;
>>>>     };
>>>>
>>>>     // Multiple labels per case (also allowed in switch statements)
>>>>     // No fallthrough with the -> form (also allowed in switch
>> statements)
>>>>
>>>> Do you find switch expressions useful? Is anything surprising? Did you
>>>> turn any switch statements into switch expressions? Please let us know
>>>> on this list, even if the answer is "Tried it. Works fine."
>>>>
>>>> To enable switch expressions in your environment:
>>>> - IntelliJ IDEA 2019.1
>>>>
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__blog.jetbrains.com_idea_2019_02_java-2D12-2Dand-2Dintellij-2Didea_&d=DwIFaQ&c=jf_iaSHvJObTbx-siA1ZOg&r=A51zLdywEjS50U7u2UMWvsDIrUGEJ5IDXskL5MxIEjA&m=yINx0-noxNSSsm-dLx2P9YD7dvF6187FW7CStT07mp4&s=-WsqDARpX60gLIBem_6IqycbQFRWL5bzkTNGVV322aU&e=
>>
>>
>>>> - Eclipse 4.11
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__www.eclipse.org_eclipse_news_4.11_jdt.php-23Java12&d=DwIFaQ&c=jf_iaSHvJObTbx-siA1ZOg&r=A51zLdywEjS50U7u2UMWvsDIrUGEJ5IDXskL5MxIEjA&m=yINx0-noxNSSsm-dLx2P9YD7dvF6187FW7CStT07mp4&s=zClnCpCg04gt1vZS1Zz8j64uam6ZkpnGMVe4M5kCYd0&e=
>>
>>
>>>> - Apache NetBeans 11.0
>>>>
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__cwiki.apache.org_confluence_pages_viewpage.action-3FpageId-3D103091452&d=DwIFaQ&c=jf_iaSHvJObTbx-siA1ZOg&r=A51zLdywEjS50U7u2UMWvsDIrUGEJ5IDXskL5MxIEjA&m=yINx0-noxNSSsm-dLx2P9YD7dvF6187FW7CStT07mp4&s=5RLv6qs5qiU3r9dJ8KjnT4aPKRyz8hxXvNN0w5Z6x94&e=
>>
>>
>>>> - jshell in JDK 12  run with `--enable-preview`
>>>> - javac in JDK 12  run with `--release 12 --enable-preview`
>>>>
>>>> Alex
>>
>>
>>
>>
>>
>>
> 



More information about the jdk-dev mailing list