This looks like something that might be useful in certain scenarios. A
"perfect fix" would always be better, but since that might be some time
off (2019 being optimistic - some of the things I want Groovy to improve
in date back to at least 2006)...
My only question would be, if it would perhaps make sense to introduce a
more generically named annotation (@AutomatismOverride, @GroovyOverride,
@Configuration,...), that would allow overriding/fine-tuning many of
Groovy's automatisms through different parameters, to avoid an
annotation-explosion over time ?
mg
On 23.01.2018 09:25, Paolo Di Tommaso wrote:
Hi all,
I want to take the opportunity to renew my proposal and PR to add an
annotation that allows the override of the Groovy default formatting
for certain classes.
https://github.com/apache/groovy/pull/566
To quickly remind you what the problem is, Groovy provides a nice
default formatting for some classes i.e. String, Map, and Collection
data structures which is good. But it makes impossible to override it
by sub-classes that implements their own toString method. The same
problem for the `equals` method. This makes difficult to handle some
specific use cases, leaving bytecode manipulation as the only alternative.
My proposal is to add an annotation named
@IgnoreDefaultEqualsAndToString (or maybe @OverrideEqualsAndToString)
to bypass the Groovy formatting and allow the invocation of
sub-classes `toString` and `equals` methods.
I agree that's a sub-optional solution, however no better solutions
have been proposed for the current and future releases.
Cheers,
Paolo
On Sun, Jun 25, 2017 at 8:35 PM, Paolo Di Tommaso
<paolo.ditomm...@gmail.com <mailto:paolo.ditomm...@gmail.com>> wrote:
Dear all,
Groovy still does not provide a mechanism to override the
`toString` and `equals` methods for custom Collection and Map
objects. This is a serious limitation in some use cases.
I'm proposing with the following pull request to introduce a
marker annotation that allows a custom object to use the
`toString` and `equals` as expected.
https://github.com/apache/groovy/pull/566
<https://github.com/apache/groovy/pull/566>
Any comment or improvement is welcome.
Cheers,
Paolo
On Thu, Jun 2, 2016 at 1:38 AM, Paul King <pa...@asert.com.au
<mailto:pa...@asert.com.au>> wrote:
I am +1 on improving how we handle formatting for lists and
maps. My
default position would be -1 on an implementation that smells
like it
might be "yet another hack" that we have to maintain long
term. The
main reason being that we are trying to streamline method
selection
for our revised MOP (I know not much is happening in that
space right
now) and it would be nicer if once that is done, the
"inconsistent"
results you mention could be handled in an easy to understand way.
Having said that, if I get time to look into it further and can't
think of a better way to approach it long term, then I could
easily be
moved to at least a -0.
Cheers, Paul.
On Tue, May 31, 2016 at 7:36 PM, Paolo Di Tommaso
<paolo.ditomm...@gmail.com <mailto:paolo.ditomm...@gmail.com>>
wrote:
> Hello guys,
>
> No feedback on this? Would you take in consideration a PR
for this proposal?
>
>
> Thanks,
> Paolo
>
>
> On Sat, May 28, 2016 at 6:26 PM, Paolo Di Tommaso
> <paolo.ditomm...@gmail.com
<mailto:paolo.ditomm...@gmail.com>> wrote:
>>
>> Hi all,
>>
>> Groovy implements a built-in formatting strategy for
collection and map
>> objects that is surely nicer and more useful than the one
provided by the
>> default Java implementation for these classes.
>>
>> However there are use cases in which custom collection or
map classes need
>> to implement their own formatting rule.
>>
>> Currently in Groovy this is quite painful and may lead to
inconsistent
>> results. Take in consideration the following example:
>>
>> class MyList extends ArrayList {
>> String toString() {
>> this.join('-')
>> }
>> }
>>
>> def x = new MyList()
>> x << 1 << 2 << 3
>>
>> println x.toString()
>> println x
>> println "$x"
>>
>> Which prints:
>>
>> 1-2-3
>> [1, 2, 3]
>> [1, 2, 3]
>>
>> Both the second and third `println` use the Groovy built-in
formatting
>> method and there's no easy way to override this behaviour.
Also there's not
>> a clear reason why the first and the second print return a
different output.
>>
>> The only options I've found is to define `MyList` with a
@Delegate without
>> implementing the `List` interface. But this leads to other
weird side
>> effects. The remaining possibility is to use some bytecode
manipulation to
>> bypass the default Groovy formatting, but it looks to me a
really
>> overkilling solution for such problem.
>>
>> For this reason a would like to propose to introduce a
mechanism that
>> would allow custom collection and map classes to bypass the
default
>> formatting method. This should not be too difficult. The
current Groovy
>> built-in formatting is implemented by formatList and
formatMap methods.
>>
>> It would be enough to add a marker interface (or an
annotation) that when
>> applied to a class it would be used to by-pass the logic in
the formatList
>> and formatMap methods and simply return the string provided
by the object
>> `toString` method.
>>
>>
>> I could easily contribute this patch however I would know
the opinion of
>> the Groovy core committers. In particular:
>>
>> 1) What name should have this marker interface?
groovy.lagn.Something?
>> 2) Are formatList and formatMap methods the right place to
add this logic?
>> 3) A similar problem exists also when using the `equals`
(and hashCode?)
>> method for collections and maps. Should this mechanism be
extended also to
>> this case?
>>
>>
>>
>> Best,
>> Paolo
>>
>>
>