Skip to content

Instantly share code, notes, and snippets.

@fcamblor
Created February 8, 2012 17:05
Show Gist options
  • Save fcamblor/1771083 to your computer and use it in GitHub Desktop.
Save fcamblor/1771083 to your computer and use it in GitHub Desktop.
JavaPPuzzler : answers
(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