Warum kann ich eine Aufzählung anonym unterordnen, aber keine Abschlussklasse?
Dieser Code:
public class Sandbox {
public enum E {
VALUE {
@Override
public String toString() {
return "I'm the value";
}
};
@Override
public String toString() {
return "I'm the enum";
}
}
public static void main(String[] args) {
System.out.println(E.VALUE);
}
}
druckt:
Ich bin der Wert
Dieser Code:
public class Sandbox {
public static final class C {
@Override
public String toString() {
return "I'm a C";
}
}
public static void main(String[] args) {
System.out.println(new C() {
@Override
public String toString() {
return "I'm anonymous";
}
});
}
}
führt zu einem Kompilierungsfehler:
cannot inherit from final HelloWorld.C
Warum könnenE.VALUE
erschaffe, was mir als anonym erscheintE
Unterklasse, die überschreibttoString
Methode, während die Verwendung einer final-Klasse anstelle einer implizit finalen Aufzählung einen Fehler bei der Kompilierung auslöst?
Genauer gesagt, warum kannVALUE
alles außer Kraft setzenE
? Ich hatte den Eindruck, dass der Code
public enum E {
VALUE;
}
war ungefähr gleichwertig mit
public static final class E {
public static final E VALUE = new E();
}
in diesem Fall wäre die anonyme Natur nicht erlaubt.
Was ist der Unterschied? Warum sind Enums besonders?