Couldn't we rather consider phasing out the whole construct ? Allowing a ctor
to be called without new only in this special case seems awfully
inconsistent....
And with the new @MapConstructor / @NamedVariant/... and @Newify(pattern=...)
support, one can achieve the same thing from modular annotation building blocks
- just without the confusing square brackets syntax (which does not work for
method calls taking a map argument).
-------- Ursprüngliche Nachricht --------Von: Paul King <[email protected]>
Datum: 04.09.18 00:30 (GMT+01:00) An: [email protected] Betreff:
Constructor call short-hand syntax
Groovy has a rarely used shorthand syntax for constructors:
println Date[time:0] // same as new Date(time:0)println Date[year: 118, month:
8, date: 3] // same as new Date(year: 118, month: 8, date: 3)
GROOVY-8602points out that the safe args version isn't supported, e.g.:
println Date?[time:0]
I was thinking of closing this as won't fix since we only support this
shorthand for class constants.
Any objections?
Also, I noticed that the empty map isn't catered for:
println Date[:] // as per above, might be expected to be the same as new
Date([:]) or new Date()
// currently NPE: Cannot get property '{}' on null object
So, the map isn't found and the expression becomes "println Date" which returns
void and then we convert the map to a String and look for that property.
I realise this is a weird edge case but I was thinking of creating an issue to
fix this for consistency (just Groovy 3). We already support this:
def map = [:]println Date[*:map]
Let me know if you have other thoughts.
Cheers, Paul.