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”

  1. Paweł on March 12th, 2009 1:27 pm

    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” :)

  2. axtaxt on June 6th, 2011 10:32 pm

    Hi! What do you use to decompile the bytecode?

    BTW: Nice blog! :)

  3. Zacheusz Siedlecki on June 7th, 2011 10:13 am

    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”

Chcesz coś napisać?





*