2006/8/15, Spark Shen <[EMAIL PROTECTED]>:
Hi All:
Constructor of EnumMap -- EnumMap(Class<K> keyType) behaves a little odd:

I first synthesis an enum type with class body as below:
enum color {
       blue{},
       red{},
}

Then constructs java.util.EnumMap(Class<K>) using this Enum type:

import java.util.EnumMap;


public class ConstructEnumMap {
   enum color {
       blue{},
       red{},
   }

   enum fruit {
       apple,
   }

   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
       new EnumMap(fruit.apple.getClass());
       *new EnumMap(color.blue.getClass());*
   }

}

NullPointerException will be thrown out from the bolded line. While
using enum type without a class body, no such exception
will be thrown out. This behavior is unspecified on spec. IMO, this is a
bug of RI.

What is your opinion about this behavior?


I have the following explanation for this behavior:
even though spec says the constructor should throw NPE if type is
null, implementation actually enforces that type is enum, like this:
if (!type.isEnum()) throw NPE;

This is proved by the following fact, the compiler generated several
classes (ConstructEnumMap$1.class, ConstructEnumMap$color$1.class,
ConstructEnumMap$color$2.class) for empty implementation of color
items, and they are not marked ACC_ENUM. The same way, NPE is thrown
on any non-enum class passed to that constructor.

I consider this runtime behavior quite reasonable, except throwable
type - certainly IAE suits better than NPE... And this is hardly
compiler bug - there is special j.l.Enum.getDeclaringClass() method
for using in such cases.

--
Regards,
Alexey

Best regards

--
Spark Shen
China Software Development Lab, IBM


---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to