RE: [lang] ClassCastException in Enum.compareTo with anonymous inner classes
Hi Jörg, thanks for your quick response and your approach to solve this issue. But anyway I think it should be possible to add these Enums to a Set without throwing a ClassCastException regardless of which class, anonymous inner class or whatever else the Enum is. Samuel -Original Message- From: Jörg Schaible [mailto:[EMAIL PROTECTED] Sent: Thursday, September 13, 2007 4:06 PM To: Jakarta Commons Users List Subject: RE: [lang] ClassCastException in Enum.compareTo with anonymous inner classes Hi Samuel, Samuel Fleischle wrote on Thursday, September 13, 2007 3:51 PM: > 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 > } >}; > [snip] > } [snip] > 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. Well, obviously those *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? IIRC, this was more about using different class loaders loading the EnumValue class. > Thanks in advance for any help or comment on this issue. Why don't you factor out a (private) interface with this method? Write an addition ctor that takes such an implementation and use otherwise a default one. With this approach the enum class is always the same and the anonymous class is of a different type. Make the an additional field in the enum class keeping that implementation and declare it as transient for seamless serialization. - Jörg - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
RE: [lang] ClassCastException in Enum.compareTo with anonymous inner classes
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 null 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]