Pattern Matching for switch (Second Preview)

forax at univ-mlv.fr forax at univ-mlv.fr
Thu Sep 23 07:03:03 UTC 2021


> From: "Tesla Ice Zhang" <ice1000kotlin at foxmail.com>
> To: "Remi Forax" <forax at univ-mlv.fr>, "jan lahoda" <jan.lahoda at oracle.com>
> Cc: "amber-dev" <amber-dev at openjdk.java.net>
> Sent: Jeudi 23 Septembre 2021 08:32:41
> Subject: Re: Pattern Matching for switch (Second Preview)

> I am thinking about the following case:

> var e = verylong.expression;
> switch (e) {
> default -> println(e.getClass());
> case X x -> doSomething(x);
> }

> I would like to inline the variable `e`, but that's impossible as we used it
> twice. However, `e` is only needed in the default case, so what about allowing
> the following syntax, where we have a pattern in the default branch?

> switch (verylong.expression) {
> default e -> println(e.getClass());
> case X x -> doSomething(x);
> }

> This should be somehow equivalent to an Object type-case:

> switch (verylong.expression) {
> case X x -> doSomething(x);
> case Object e -> println(e.getClass());
> }

It's not exactly the same semantics because "Object e" allows null while "default" don't. 

> But I like the default syntax since it can be put to the beginning of the switch
> expression, and the type of `e` may not always be Object.

You will be able to use "var" instead of "Object" soon. 

Anyway, the question is should we allow the syntax "default variable" ? 

The example being if the switch is in a lambda or in a case (syntaxes that reward you if you write your code as a single expression) because introducing a local variable make the code uglier. 

By example, 
IntUnaryOperator op = x -> switch(x.foo(3)) { 
default -> { /* how to access to the value of x.foo(3) here ? */ } 
}; 

The current solution is to introduce a local variable, but it makes the code bulky 
IntUnaryOperator op = x -> { 
var result = x.foo(3); 
return switch(result) { 
default -> { /* use 'result' here */ } 
}; 
}; 

The reason to not do that is that is that the more "shortcut syntax" we introduce, the harder it is to read codes for everybody but the experts. 

> Regards,
> Tesla

regards, 
Rémi 

> ---Original---
> From: "Remi Forax"<forax at univ-mlv.fr>
> Date: Wed, Sep 22, 2021 16:37 PM
> To: "jan lahoda"<jan.lahoda at oracle.com>;
> Cc: "amber-dev"<amber-dev at openjdk.java.net>;
> Subject: Re: Pattern Matching for switch (Second Preview)

> And i think we should also fix the following

> 4. a case that mix constants and a type pattern (or a guard) of a supertype of
> the types of the constants should be allowed
> By example,
> case 3, Integer i ->
> or
> case 4, Object o ->

> 5. add an partial order edge between a guarded pattern and a constant of a
> subtypes of the type of the guarded pattern
> This code currently compiles
> switch(value) {
> case Integer i && bar() -> {}
> case 3 -> {}
> case Integer i -> {}
> }

> but i think it should be written
> switch(value) {
> case 3 -> {}
> case Integer i && bar() -> {}
> case Integer i -> {}
> }

> so the code is easier to read.

> Rémi

> ----- Original Message -----
> > From: "jan lahoda" <jan.lahoda at oracle.com>
> > To: "amber-dev" <amber-dev at openjdk.java.net>
> > Sent: Mercredi 22 Septembre 2021 18:11:13
> > Subject: Pattern Matching for switch (Second Preview)

> > Hi,

> > There is a new draft JEP for preview 2 of Pattern Matching for switch here:
> > https://bugs.openjdk.java.net/browse/JDK-8273326

> > The exact changes that will be done under this round of preview are yet
> > to be determined, but changes related to generics handling in pattern
> > matching switches seem to be plausible.

> > Feedback is welcome!

> > Thanks,
> > Jan


More information about the amber-dev mailing list