Draft JEP: Unnamed local variables and patterns
Remi Forax
forax at univ-mlv.fr
Tue Oct 18 14:41:44 UTC 2022
> From: "Angelos Bimpoudis" <angelos.bimpoudis at oracle.com>
> To: "amber-spec-experts" <amber-spec-experts at openjdk.java.net>
> Sent: Friday, October 14, 2022 4:59:08 PM
> Subject: Re: Draft JEP: Unnamed local variables and patterns
> Hello experts!
> Regarding the code locations where underscore is being introduced: The EG
> already agreed on local variables and lambda parameters only, for now. To recap,
> this approach has the advantage of mostly lining up with the uses of `var` and
> also, that it includes code locations that deal with implementation details, as
> opposed to API (fields or method formal parameters). Thus, the N places where
> locals are declared in Java are the following:
> 1. the header of an enhanced for loop
> 2. a local variable declaration statement in a block
> 3. a catch formal parameter
> 4. a formal parameter of a lambda expression
> 5. a pattern variable
> 6. the header of a basic for statement
> 7. a resource specification of a try-with-resources statement
> The obvious place to start introducing the meaning of the underscore token is to
> "all of these", targeting uniformity in the language. The downside is that some
> of those places are pretty messy (e.g., for loops) and Java developers may not
> like this.
> So, this puts us in a position between two general principles: uniformity
> (support all of the above) and being seen to have introduced underscore in
> places where underscore shouldn't make sense.
Should not make sense or can be written in a better way ?
> Where things are getting confusing are the following:
> 6. the header of a basic for statement
> At the moment, there is code out there that uses the for statement in weird
> ways, like:
> `for(sideEffects(), moreSideEffects(); condition() > flag;) { }`
> This is admittedly already a bit confusing. Do we really want to add to that the
> ability to use underscore?
> `for (var _ = sideEffects(); true; ) { ... }`
> That code could be refactored to:
> ```
> var _ = sideEffects();
> for (; true; ) { ... }
> ```
> I am wondering if `_` has a place in the init list of a regular for..
Given that people already write things like
for(boolean unused = sideEffects(); ...;) { ... }
i think that replacing "unused" by '_' is a step forward.
> 7. a resource specification of a try-with-resources statement
> Today we get this warning with a TWR-statement if the local is ignored:
> > javac -Xlint:all MyScopedLock.java
> MyScopedLock.java:23: warning: [try] auto-closeable resource ignored is never
> referenced in body of corresponding try statement
> try(MyScopedLock ignored = l.lock()) {
> ^
> 1 warning
> So here we may have a clash of philosophies for the enhanced-for and how people
> use the `AutoCloseable`.
I think we should disallow '_' here, mostly because
> Looking forward to hearing your thoughts.
> Best,
> Angelos
> From: amber-spec-experts <amber-spec-experts-retn at openjdk.org> on behalf of
> Angelos Bimpoudis <angelos.bimpoudis at oracle.com>
> Sent: 29 September 2022 19:03
> To: amber-spec-experts <amber-spec-experts at openjdk.java.net>
> Subject: Draft JEP: Unnamed local variables and patterns
> Dear experts,
> The draft JEP for unnamed local variables and patterns, that has been previously
> discussed on this list is available at:
> https://bugs.openjdk.org/browse/JDK-8294349
> Comments welcomed!
> Angelos
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-spec-observers/attachments/20221018/65ada694/attachment-0001.htm>
More information about the amber-spec-observers
mailing list