Storia della questione:
Sin dall'inizio, Java ha introdotto il concetto di membri statici della classe, distinti dai membri di istanza — queste variabili vengono memorizzate a livello di classe, non di oggetto. Questo consente di condividere dati tra tutte le istanze della classe o di utilizzare costanti e strutture di servizio.
Problema:
La principale funzione dei campi statici è fornire dati per tutti gli oggetti della classe o implementare un unico punto di accesso. Tuttavia, un uso improprio di static può portare a errori difficili da rilevare, legati allo stato globale, alle condizioni di gara e ai problemi nei test.
Soluzione:
I campi statici vengono dichiarati utilizzando la parola chiave static:
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
Ad ogni creazione di un'istanza, il contatore aumenta e il valore è accessibile tramite Counter.globalCount, indipendentemente dall'oggetto.
Caratteristiche chiave:
È possibile accedere a un campo statico tramite un oggetto, anziché tramite il nome della classe?
Sì, la sintassi consente di accedere a un campo statico tramite un oggetto, ma ciò porta a codice poco leggibile e talvolta fuorviante. È meglio sempre accedere tramite il nome della classe.
Counter c = new Counter(); System.out.println(c.globalCount); // Funziona, ma non è raccomandato
Possono i campi statici essere privati?
Sì, il livello di accesso non è limitato. I campi statici privati sono spesso utilizzati insieme a metodi statici pubblici (ad esempio, per Singleton):
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
Cosa succede se si tenta di inizializzare un campo statico con un valore dipendente da uno non statico?
Tale codice non verrà compilato, perché i campi non statici vengono inizializzati dopo quelli statici. Un campo statico non può riferirsi direttamente a uno non statico.
In grandi applicazioni, un campo statico è utilizzato per memorizzare dati cache che sono specifici per l'utente.
Pro:
Contro:
Utilizzo di public static final String per memorizzare costanti (ad esempio, codici di errore o parametri standard).
Pro:
Contro: