ciamba87 ha scritto:
La cosa che non capisco è perchè si possano mettere delle "istanziazioni" della classe Azione all'interno degli attributi della classe stessa.
È perfettamente lecito e tecnicamente corretto. Essendo poi quei campi "di classe" (static) non ci sono problemi nella sequenza di inizializzazione degli oggetti istanziati.
Ci sarebbero problemi (grossi problemi ....) se il campo fosse "di istanza".
Se provi questo:
public class Prova {
private Prova p = new Prova();
public Prova() {
System.out.println("costruttore Prova");
}
}
E poi da qualche parte (in Prova o altrove) fai un
new Prova(); ti accorgi subito che ti becchi un bel StackOverflowError, ovvero lo stack "scoppia".
Tu istanzi un Prova ma la inizializzazione del campo 'p' porta ad un nuovo oggetto Prova che di nuovo deve inizializzare il suo campo 'p' e quindi un nuovo Prova ecc......
Questo infatti è SBAGLIATO.
ciamba87 ha scritto:
Tra l'altro utilizza la forma Azione("AVANTI") senza avere introdotto un costruttore Azione(String).
NON ha importanza dove si trova lessicalmente nella classe il costruttore. Potrebbe stare dopo (come nell'esempio) o prima di quei campi static.
Il costruttore c'è, esiste e può essere invocato.
ciamba87 ha scritto:
In pratica, se non ho capito male, alla fine il risultato è che la classe potrà assumere solo i tre valori "AVANTI", "INDIETRO" e "FERMO".
Nì. Quel codice è qualcosa che tenta, in un certo senso, di avvicinarsi al concetto di una
enum (dove ci sono solo N istanze esatte che sono quelle assegnate alle costanti della enum) ma in realtà è "troppo aperta". Il costruttore è public (quindi invocabile ovunque e da qualunque codice) e oltretutto c'è il setter setNome, quindi lo stato è pure "mutabile".
Insomma, è parecchio lontano dal concetto delle enum!