Hi do not think we have yet discussed about using the record pattern in an 
enhanced for
  
https://cr.openjdk.java.net/~gbierman/jep432%2b433/jep432+433-20221018/specs/patterns-switch-record-patterns-jls.html#jls-14.14.2

My first reaction when reading that part of the spec was, ok, cool, a bit weird 
to not piggyback it on pattern assignment but on the switch instead.
But this morning in the shower, it was more, wait a minute ... it means that a 
record pattern and a type declaration using the same type do not work the same.

For example, with a sealed interface I and a record Impl(int value), it's sole 
implementation.

  With the proposed semantics, you can write
     I i = ...
     for(Impl(var value) : List.of(i)) {  // use a record pattern
       System.out.println(value);   
     }
     
   but you can not write
     I i = ...
     for(Impl impl : List.of(i)) {       // use a type declaration, does not 
compile !
       System.out.println(impl.value());   
     }

  I hope we can keep the invariant that a record pattern and a variable 
declaration with the same type should both work the same way.


There is also a minor issue that looks like an overlook but refactoring an 
exhanced for from using a declaration to a record pattern is a little dangerous 
because if the iterable is null the semantics change, with the record pattern 
it throws a MatchException instead of a NPE.

regards,
Rémi

Reply via email to