Por que eu posso anonimamente subclassificar um enum mas não uma aula final?
Este código:
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);
}
}
impressões:
Eu sou o valor
No entanto, este código:
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";
}
});
}
}
resulta em um erro de compilação:
cannot inherit from final HelloWorld.C
Por que podeE.VALUE
criar o que parece ser um anônimoE
subclasse, sobrepondo otoString
método, enquanto usando uma classe final em vez de um enum implicitamente final lança um erro de tempo de compilação?
Mais especificamente, por queVALUE
substituir tudo emE
? Fiquei com a impressão de que o código
public enum E {
VALUE;
}
foi aproximadamente equivalente a
public static final class E {
public static final E VALUE = new E();
}
caso em que a natureza anônima não seria permitida.
Qual é a diferença? Por que as enums são especiais?