enum - zabawy z dekompilatorem
Zastanawiałeś się co tak na prawdę kryje się pod nową (od 5.0) składnią enum w Javie? Dlaczego enum nie może rozszerzać innej klasy? Przejrzenie zdekompilowanego kodu pozwoli zrozumieć wiele niuansów.Tak wygląda przykładowy enum:
public enum SampleEnum { FIRST, SECOND }
Po kompilacji a następnie dekompilacji bez rozwijania składni enum wygląda tak:
public final class SampleEnum extends Enum { public static final SampleEnum FIRST; public static final SampleEnum SECOND; private static final SampleEnum ENUM$VALUES[]; static { FIRST = new SampleEnum("FIRST", 0); SECOND = new SampleEnum("SECOND", 1); ENUM$VALUES = (new SampleEnum[] { FIRST, SECOND }); } private SampleEnum(String s, int i) { super(s, i); } public static SampleEnum[] values() { SampleEnum asampleenum[]; int i; SampleEnum asampleenum1[]; System.arraycopy(asampleenum = ENUM$VALUES, 0, asampleenum1 = new SampleEnum[i = asampleenum.length], 0, i); return asampleenum1; } public static SampleEnum valueOf(String s) { return (SampleEnum) Enum.valueOf(SampleEnum, s); } }
Już tak prosty przykład wyjaśnia nam sporo na temat tej zagadkowej dla niektórych konstrukcji. Szczególnie wymowne jest użycie konstruktora Enum:
/** * Sole constructor. Programmers cannot invoke this constructor. * It is for use by code emitted by the compiler in response to * enum type declarations. * * @param name - The name of this enum constant, which is the identifier * used to declare it. * @param ordinal - The ordinal of this enumeration constant (its position * in the enum declaration, where the initial constant is assigned * an ordinal of zero). */ protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; }
Dekompilacji bardziej złożonych przykładów jak instrukcja switch z użyciem enum jednak nie polecam ;)
Zacheusz Siedlecki
Komentarze
3 komentarzy do “enum - zabawy z dekompilatorem”
Chcesz coś napisać?
No ciekaw jestem przyznam jakie piękne krzaczki powstaną ze switch-a :)
A co do kodu to nie ma się co dziwić - cudów nie ma - jak jest kompatybilne wstecz to musi to być w ten sposób zaimplementowane “za nas” :)
Hi! What do you use to decompile the bytecode?
BTW: Nice blog! :)
JAD Java Decompiller http://www.varaneckas.com/jad
but JD-Java Decompiller http://java.decompiler.free.fr/ supports new features of Java 5, such as annotations, generics or type “enum”