questo codice:Perché posso sottoclasse anonimamente un enum ma non una classe finale?
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);
}
}
stampe:
I'm the value
Tuttavia, questo codice:
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";
}
});
}
}
risultati in un errore di compilazione:
cannot inherit from final HelloWorld.C
Perché c un E.VALUE
crea una sottoclasse anonima E
, sovrascrivendo il metodo toString
, mentre l'uso di una classe finale invece di un enum finale implicito genera un errore in fase di compilazione?
In particolare, perché VALUE
può sovrascrivere qualsiasi cosa in E
? Ho avuto l'impressione che il codice
public enum E {
VALUE;
}
era o meno equivalente a
public static final class E {
public static final E VALUE = new E();
}
nel qual caso la natura anonima non sarebbe stato permesso.
Qual è la differenza? Perché le enumerazioni sono speciali?
Impossibile spiegarne il motivo, ma JLS7 afferma che _L'ente di classe facoltativo di una costante di enum definisce implicitamente una dichiarazione di classe anonima (§15.9.5) che estende il tipo di enum immediatamente racchiuso. L'organismo di classe è governato dalle solite regole delle classi anonime; in particolare non può contenere alcun costruttore. Forse l'intenzione era di dare allo sviluppatore una maggiore flessibilità nel definire le costanti di enum. –
Le enumerazioni sono state progettate in questo modo per servire scopi di programmazione speciali non coperti da questa risposta. – Piovezan
Perché le enumerazioni in Java sono ... speciali. Hai detto rozzamente te stesso. Se qualcuno scrivesse l'idea alla base del ragionamento sarebbe grandioso, naturalmente. +1 ancora per uno snippet interessante. –