Lo zucchero di sintassi fornito dalla funzione Java enum
può a volte creare confusione. Considerate questo esempio, che non può essere compilato:Contesto statico nella definizione enum
public enum TestEnum {
FOO("foo") {
public void foo() {
helper(); // <- compiler error
}
};
String name;
TestEnum(String name) {
this.name = name;
}
public abstract void foo();
private void helper(){
// do stuff (using this.name, so must not be static)
}
}
qualcuno può spiegare il motivo per cui il compilatore dice
metodo non statico 'helper()' non è possibile fare riferimento da un contesto statico
In che modo esattamente questo contesto è statico?
È possibile effettuare questa compilazione cambiando la chiamata a this.
helper()
(qui è un punto di confusione: se siamo davvero in un "contesto statico" come il compilatore suggerisce, come si può "this
" lavorare) o aumentando la visibilità di helper()
al livello predefinito. Quale preferiresti? Inoltre, sentitevi liberi di suggerire una migliore titolo della domanda :-)
Edit: Ho trovato some discussion about this - ma nessuna risposta. Il mio collega pensa che il fatto che lo this.helper()
funzioni sia in realtà un bug del compilatore. E infatti con le nuove versioni di Java sembra che non sia funzionante (sebbene lo sia super.helper()
): "impossibile trovare l'helper di simbolo()". (Anche se c'è qualcosa di strano: dopo aver provato con diverse versioni Java non riesco a ottenere this.helper()
per compilare di nuovo con nessuno di loro ...)
Ho il libro; quale enigma vuoi dire? (Non sono riuscito a trovarlo rapidamente.) – Jonik
Entrambe le mie copie del libro sono imballate in scatole da qualche parte, quindi non ne ho idea. –