Hi,
I updated from Commons Lang 2.1 to Commons Lang 2.3 and got some issues with 
the changed compareTo() method of Enum with anonymouse inner classes:

Here is my simplified Enum:


public class ItemStatus extends Enum
{
       // -------------------------------------------------- Static Fields
      public static final ItemStatus CANCEL = new ItemStatus("CANCEL", 
"Cancel");

       public static final ItemStatus SHIPPED = new ItemStatus("SHIPPED", 
"Shipped") {
        public String getDisplayName() {
                // do something special for this status
                }
       };

      public static final ItemStatus MOVED = new ItemStatus("MOVED", "Moved") {
        public String getDisplayName() {
                        // do something special for this status
                }
       };

       /** Contains each status. */
      private static Set statuses;

        // -------------------------------------------------- Instance Fields
        /** Name to display in user interfaces. */
        private final String displayName;

       // --------------------------------------------------- Constructors

      protected ItemStatus(String name, String displayName) {
            super(name);
        this.displayName = displayName;
            System.out.println(this.getClass().getName());
            buildStatusSet();
      }

      // --------------------------------------------------- Static Methods

      /**
       * Returns the item status enumeration object
         * for the given status name.
       *
       * @param itemStatus
       *            name of the item status
       * @return the enumeration object, or <code>null</code> if it does not
       *         exist
       */
      public static ItemStatus valueOf(String itemStatus) {
            return (ItemStatus) getEnum(ItemStatus.class, itemStatus);
      }

      // --------------------------------------------------- Public Methods

      /**
       * [EMAIL PROTECTED]
       */
      // @Override
      public final Class getEnumClass() {
            return ItemStatus.class;
      }

      /**
       * Gets all defined ItemStatus.
       *
       * @return the enum object List
       * @see org.apache.commons.lang.enums.Enum#getEnumList(Class)
       */
      public static List getEnumList() {
            return getEnumList(ItemStatus.class);
      }

       public String getDisplayName() {
                return displayName;
        }

      // --------------------------------------------------- Private Methods

      /**
       * Adds the status name to a Set of status names.
       */
      private void buildStatusSet() {
            if (statuses == null) {
                  statuses = new TreeSet();
            }
            statuses.add(this);
      }
}

And I got the ClassCastExcetion in the private "buildStatusSet()-Method if I 
try to add the status to the TreeSet. The TreeSet calls the compareTo-Method of 
the Enum. In Commons Lang 2.2 this method was changed with an additional 
comparison of the classes.
In my constructor I added a System.out.println of the instantiated classes and 
got the following output for the classnames:

com.myapp.common.model.order.ItemStatus
com.myapp.common.model.order.ItemStatus$1
com.myapp.common.model.order.ItemStatus$2

The compareTo-Method now tries to compare ItemStatus$1 with ItemStatus$2 and 
says to me, that my ItemStatus-Enums are different classes.

I saw in JIRA there are some other issues in ValuedEnum.compareTo(). Is there a 
bug in the Enum.compareTo() implementation which got changed in Lang 2.2?

Thanks in advance for any help or comment on this issue.

Regards,
Sam


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to