Ho questo codice:Come evitare problemi derivanti dall'accesso ai campi statici prima dell'inizializzazione della classe?
public abstract class Person {
public static final class Guy extends Person {
public static final Guy TOM = new Guy();
public static final Guy DICK = new Guy();
public static final Guy HARRY = new Guy();
}
public static final List<Guy> GUYS = ImmutableList.of(Guy.TOM, Guy.DICK, Guy.HARRY);
}
Lo so, sembra che dovrebbe essere un enum, e sarebbe, ma ha bisogno di ereditare da una persona, una classe astratta.
Il mio problema è: se provo ad accedere all'elenco dei ragazzi, sto bene. Ma provo ad accedere a qualsiasi Guy in particolare, ho un problema: Guy
viene caricato prima dello Person
. Tuttavia, dal momento che Guy
eredita Person
, Person
viene caricato e tenta di accedere a TOM
, ma dal momento che Guy
è già stato caricato, non può iniziare a caricare di nuovo, e quindi abbiamo un riferimento null. (E ImmutableList
non accetta nulla, così abbiamo ottenere un'eccezione.)
quindi so perché questo sta accadendo, ma non sono sicuro come evitarlo. Potrei spostare l'elenco nella classe Guy
, ma avrò più di un'implementazione di Person
e mi piacerebbe avere un elenco principale di tutti i Person
s nella classe Person
.
Mi sembra strano che sia possibile caricare una classe interna statica senza caricarne la classe contenente, ma suppongo che abbia senso. C'è un modo per risolvere questo problema?
Non tenere i ragazzi in "Ragazzo" o "Persona". Conservalo in una classe 'PersonManager' o 'People' o come vuoi chiamarlo. –
La ragione per cui mi piace in questo modo è che posso fare "Guy.TOM", che credo abbia una migliore leggibilità. – codebreaker
Se il ragazzo non fosse statico, potresti semplicemente fare qualcosa del tipo: 'Guy tom = new Guy()' 'Lista guys = new ArrayList <>()' 'guys.add (tom)' –
EricF