Re: GEP-16: val keyword for final declarations

MG <mgbiz-yvYIh6MZAuFWk0Htik3J/[email protected]> Tue, 14 Apr 2026 21:39:09 +0200
Newsgroups gmane.comp.lang.groovy.devel
Message-ID <[email protected]>
"var val" is Java, "val val" is not.

Am 14.04.2026 um 08:31 schrieb Guillaume Laforge:
> We also have var although we had def.
> It's a convenience to have some more copy/pasting friendliness with 
> languages that adopted val.
>
> On Tue, Apr 14, 2026 at 12:30 AM MG <mgbiz-yvYIh6MZAuFWk0Htik3J/[email protected]> wrote:
>
>     Hi Caleb,
>
>     my main argument is that one does not need "val", if already
>     existing "final" would do the same thing, i.e. do RHS type
>     inference  (see also "To add to my initial arguments" in my reply
>     to Christopher Smith).
>
>     Cheers,
>     mg
>
>     PS: To comment on some of your points:
>
>      1. One does not always have the luxury of using an IDE when
>         looking at Groovy code.
>      2. A simple syntax highlighting editor (if that is available)
>         might struggle with separating "val" the keyword from "val"
>         the variable/field name (one of the many reasons why I think
>         "val" is such a bad choice).
>      3. @any declaration that takes multiple words: True for most ppl,
>         full agreement, but we can use existing single word "final"
>         keyword (or, if necessary, introduce a better one than "val"),
>         as in final x = new Foo().
>      4. @value-based semantics never having been a thing in any JVM
>         languages: It is in Groovy, see @Immutable* (which GEP-16
>         explicitly states of being a non-goal of introducing a "val"
>         keyword).
>
>     *https://docs.groovy-lang.org/latest/html/gapi/groovy/transform/Immutable.html
>
>
>     Am 13.04.2026 um 02:23 schrieb Caleb:
>>     MG,
>>
>>     A note on "val" looking similar to "var": any good IDE labels
>>     final and non-final variables differently, e.g. IJ uses an
>>     underline. Even vim does this afaik.  The keywords look similar
>>     in isolation, sure, but everywhere besides the declaration,
>>     you're not looking at the keyword for that info.  And with the
>>     underline on the variable, the declarations don't look similar at
>>     all from experience.  I've never been confused in Kotlin, even
>>     coming from Java where var was the only similar keyword.
>>
>>     Plus, from my experience, any declaration that takes multiple
>>     words to communicate it (even something as small as "let mut")
>>     just feels clunky compared to "val" and "var".  It doesn't feel
>>     good to use, as it takes up more space in your brain trying to
>>     read it.
>>
>>     You're also intuitively dissuaded from using the more complicated
>>     one because it takes an extra word, so if "final" is the extra
>>     word and it's not necessary to basic operation, very few people
>>     will use it. (See: Java, C, C++, literally every single language
>>     where "final" is the "second word".)
>>
>>     On the topic of val meaning value-based semantics: that's never
>>     been a thing in any JVM languages, and val isn't used as a
>>     keyword in the major languages where it does exist. (Namely C,
>>     C++, and Rust.)
>>
>>     Cheers,
>>     Caleb
>>
>>     On Sun, Apr 12, 2026, 6:35 PM MG <mgbiz-yvYIh6MZAuFWk0Htik3J/[email protected]> wrote:
>>
>>         Hi Paul,
>>
>>         I still have the following gripes with using "val" (and two
>>         other languages having imho made a bad choice here still does
>>         not change that :-) ):
>>
>>          1. "val" for me indicates value- (as opposed to reference)
>>             based semantics, i.e. copy semantics / deep immutabilty,
>>             which the proposal explictly states is not the goal here
>>             (see Non-goals @Immutable in the GEP).
>>          2. "val" looks a lot like "var".
>>              1. So if looking over code it is harder to spot an error
>>                 in this regard
>>              2. And it might be confusing for ppl new to Groovy
>>                 (unless they come from Kotlin or Scala, which I find
>>                 unlikely to happen).
>>          3. "val" is a variable name ppl use (Contrary to final, def
>>             and var).
>>              1. While this would still work , e.g. "val val" just
>>                 looks akward.
>>              2. As well as making code using "val" as a variable name
>>                 generally worse to read.
>>          4. I see no need for "val", when it seems the same effect
>>             could be reached by changing the semantics of existing
>>             "final" to use RHS type deduction*.
>>              1. It seems to me this would not be a breaking change... (?)
>>          5. So while having type deduction would help our framework
>>             quite a bit, I would argue for:
>>              1. "final" to finally be type deducing* G-)
>>              2. Or at least for a different keyword to be used.
>>                  1. It is late and I need to go to sleep, but from
>>                     the top of my head: "fvar" or "fin"
>>                      1. ("fin" would hit two birds with one stone:
>>                         shorten the quite long "final" and supply
>>                         type deduction).
>>
>>         Cheers,
>>         mg
>>
>>         *straightforward & stable, i.e. 99% what the user expects -
>>         make the frequent case easy/fast, make the rare case correct
>>         (i.e. require the developer to supply an explicit type).
>>
>>
>>
>>         Am 12.04.2026 um 13:59 schrieb Paul King:
>>>         Hi folks,
>>>
>>>         We have been asked numerous times about the possibility of
>>>         having a "val" keyword to match Kotlin and Scala. We also
>>>         have had a related Jira open for more than 6 years. So I
>>>         created a GEP to help frame a discussion about what would be
>>>         involved and help us make a decision:
>>>
>>>         https://groovy.apache.org/wiki/GEP-16.html
>>>
>>>         I know we have "final", but many developers I speak to from
>>>         the Kotlin and Scala worlds are big fans of "val" and
>>>         believe it was the right name to use for those two languages.
>>>
>>>         Given that it involves changes to only about 15 lines of
>>>         production Groovy code and has well-identified impacts
>>>         (arguably edge cases with workarounds), I am largely in
>>>         favor of this proposal, but I am keen to hear other's thoughts.
>>>
>>>         Cheers, Paul.
>>>
>>>
>>
>
>
>
> -- 
> *Guillaume Laforge*
> Apache Groovy committer*
> *
> Developer Advocate @ Google Cloud <https://cloud.google.com/>
>
>   * Blog: glaforge.dev <http://glaforge.dev/>
>   * X: @glaforge <http://twitter.com/glaforge>
>   * Bluesky: @glaforge.dev <https://bsky.app/profile/glaforge.dev>
>   * Mastodon: @[email protected] <http://%[email protected]/>
>