Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-9003

Allow the override of toString and equals methods for collection objects

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • None
    • None
    • None

    Description

      Groovy provides a nice string representation for collection objects, however the current behaviour do not allow custom collection classes to provide own string representation not to implement a custom object identity rule.

      For example:

      
      class Mylist extends ArrayList {
        Mylist(Collection c) { super(c) } 
        @Override boolean equals(Object o) { throw new UnsupportedOperationException () }
        @Override int hashCode() { throw new UnsupportedOperationException () }
        @Override String toString() { return 'CUSTOM STRING' }
      }
      
      
      def l = new Mylist([1,2,3]) 
      assert l.toString() == 'CUSTOM STRING'
      assert "$l" == '[1, 2, 3]'
      
      
      def q = new Mylist([1,2,3])
      assert l.equals(q)
      assert l == q 
      
      

      In the Mylist class the toString method is not invoked in the string interpolation and equals is not invoked by the == operator. This breaks the java polymorphism contract and create several hassles when implementing custom collection classes.

       I would propose to fix this behaviour in Groovy 3.0. It would be enough to check if the target class implements the toString and equals methods otherwise fallback on the current Groovy behaviour.

       

      Attachments

        Activity

          People

            Unassigned Unassigned
            pablo72 paolo di tommaso
            Votes:
            1 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated: