Created
February 8, 2012 17:05
-
-
Save fcamblor/1771083 to your computer and use it in GitHub Desktop.
JavaPPuzzler : answers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(1) 10 classes ! | |
Obvious ones : | |
com.puzzlers.a.SimpleEnum | |
com.puzzlers.b.SimpleAnonymousEnum | |
com.puzzlers.c.ClassWithNestedEnum | |
com.puzzlers.c.ClassWithNestedEnum$NestedEnum | |
com.puzzlers.d.ClassWithNestedAnonymousEnum | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$NestedAnonymousEnum | |
com.puzzlers.JavaPPuzzler | |
Obvious ones if you know that anonymous enum produces one class per enum value : | |
com.puzzlers.b.SimpleAnonymousEnum$1 | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$NestedAnonymousEnum$1 | |
... and the first "wtf" of this puzzler : | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$1 | |
=> Yeah ! When you have a nested anonymous enum, java will generate an "anonymized" form of the enclosing class. | |
(2) Ok now.. let's see what is displayed for super classes and compare it with what is given by javap : | |
com.puzzlers.a.SimpleEnum has superclass : class java.lang.Enum (javap: Enum) | |
com.puzzlers.b.SimpleAnonymousEnum has superclass : class java.lang.Enum (javap: Enum) | |
com.puzzlers.b.SimpleAnonymousEnum$1 has superclass : class com.puzzlers.b.SimpleAnonymousEnum (javap: Enum) <- WTF! | |
com.puzzlers.c.ClassWithNestedEnum has superclass : class java.lang.Object (javap: Object) | |
com.puzzlers.c.ClassWithNestedEnum$NestedEnum has superclass : class java.lang.Enum (javap: Object) <- WTF! | |
com.puzzlers.d.ClassWithNestedAnonymousEnum has superclass : class java.lang.Object (javap: Object) | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$1 has superclass : class java.lang.Object (javap: Object) | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$NestedAnonymousEnum has superclass : class java.lang.Enum (javap: Object) <- WTF! | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$NestedAnonymousEnum$1 has superclass : class com.puzzlers.d.ClassWithNestedAnonymousEnum$NestedAnonymousEnum (javap: Object) <- WTF! | |
com.puzzlers.JavaPPuzzler has superclass : class java.lang.Object (javap: Object) | |
Here, we can see that javap acts really strangely compared to what is expected in general (to my POV). | |
What we can learn here : | |
- Non nested enums inhertit from Enum, everytime ! Javap behaves strangely on anonymous enum : it considers the anonymous class as inheriting Enum type instead of base enum type (SimpleAnonymousEnum) | |
- When we have nested enum, if this is a "normal" (non anonymous) enum, it inherits from Enum, too (and javap considers it should inherit from Object). | |
- If this is an anonymous nested enum, the anonymous enum logically inherits from the enum type it is anonymized on. | |
- A class with a nested anonymous enum will have as much anonymous classes than enum values. And strangest thing is these anonymous classes don't inherit from base class (I would have expected ClassWithNestedAnonymousEnum$1 inherits from ClassWithNestedAnonymousEnum instead of Object !) | |
(3) And now, same thing but for interfaces : | |
com.puzzlers.a.SimpleEnum implements Serializable ? true (javap: true) | |
com.puzzlers.b.SimpleAnonymousEnum implements Serializable ? true (javap: true) | |
com.puzzlers.b.SimpleAnonymousEnum$1 implements Serializable ? true (javap: true) | |
com.puzzlers.c.ClassWithNestedEnum implements Serializable ? true (javap: true) | |
com.puzzlers.c.ClassWithNestedEnum$NestedEnum implements Serializable ? true (javap: true) | |
com.puzzlers.d.ClassWithNestedAnonymousEnum implements Serializable ? true (javap: false) <- WTF! | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$1 implements Serializable ? false (javap: false) | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$NestedAnonymousEnum implements Serializable ? true (javap: false) <- WTF! | |
com.puzzlers.d.ClassWithNestedAnonymousEnum$NestedAnonymousEnum$1 implements Serializable ? true (javap: true) | |
com.puzzlers.JavaPPuzzler implements Serializable ? true (javap: true) | |
There are differences here, too, between reality and what javap displays ! (particularly on ClassWithNestedAnonymousEnum) | |
More strange (to my POV) ones : ClassWithNestedAnonymousEnum$1 doesn't implement Serializable !! | |
So ... how to make it implement Serializable ? For the moment, I don't know :) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment