I think this would be a great addition. I had this use case 2 years ago:
I have a class the is want plus to be immutable and plusEquals to be
mutable e.g:
def newMatrix = myMatrix + additionalRows
assert myObj == myMatrix - additionalRows
myMatrix += additionalRows
assert myMatrix == newMatrix
Since my implementation of plus involves cloning myMatrix which in my
case is expensive, it would be a big difference if I could avoid that
when there is no need. However += is calling plus and then assigning
the result under the covers. Is there a way to "get to it" to override?
Btw: PLUS_ASSIGN would be clearer than ADD_ASSIGN i think
Best regards,
Per
On 3/8/26 09:53, Paul King wrote:
Hi Sterling,
This is certainly something we could consider for Groovy 6. That is
currently where we'd like to put most of our focus, and where we have
some nice performance improvements that could be of benefit to Gradle
and other frameworks in the Groovy ecosystem. The current
implementation chose a very specific way to handle all of the
assignment operators, and this leads to simplicity and minimises edge
cases across the variations: ADD_ASSIGN, SUB_ASSIGN, MUL_ASSIGN,
DIV_ASSIGN, AND_ASSIGN, OR_ASSIGN, XOR_ASSIGN, MOD_ASSIGN,
LSHIFT_ASSIGN, RSHIFT_ASSIGN, URSHIFT_ASSIGN, and ELVIS_ASSIGN.
The more backwards compatible the change is, the more likely it is we
could backport, but we'll be ramping down focus on Groovy 4 soon and
mostly attempting to handle critical bugs. Having said that, I am
interested in others' thoughts.
Cheers, Paul.
On Sun, Mar 8, 2026 at 6:33 PM Sterling Greene <[email protected]>
wrote:
Hey Groovy people.
Groovy currently supports operators like a+=b by decomposing them
into a=a+b and + is implemented with a plus() method. Kotlin does
something similar.
Kotlin also supports overloading "augmented assignments":
https://kotlinlang.org/docs/operator-overloading.html#augmented-assignments
which appears to just be another way of saying "assignment
arithmetic operators." In Kotlin, a type can implement plusAssign
and plus and the appropriate one will be selected depending on the
scenario.
My proposal is to add support in Groovy for these methods too.
Groovy would start calling plusAssign instead of decomposing into
an assignment and call to plus. There are details about fallbacks
and differences between static and dynamic Groovy, but I'm happy
to provide those if this seems like a reasonable idea.
I would also be willing to implement this.
My questions:
Is this reasonable and what's the best way to discuss this further?
Is it possible for this to be added to Groovy 4?
The reason Groovy 4 is important to us is that Gradle 9 currently
uses Groovy 4. We want to make API changes in Gradle 10 and the
current behavior of += with FileCollections is causing some
headaches. Getting support for overloading += directly in Gradle 9
could make the API changes in Gradle 10 less painful.
Thanks!
--
Sterling Greene
Senior Lead Software Engineer
Gradle Technologies
gradle.com
<https://gradle.com/>image.png
*
CONFIDENTIALITY NOTICE*: The contents of this email message, and
any attachments, are intended solely for the addressee(s) and may
contain confidential, proprietary and/or privileged information
legally protected from disclosure. If you are not the intended
recipient of this communication, or if you received this
communication by mistake, please notify the sender immediately and
delete this message and any attachments. If you are not the
intended recipient, you are hereby notified that any use,
retransmission, dissemination, copying or storage of this message
or its attachments is strictly prohibited.