Dobbiamo distinguere due aspetti delle costanti:
- nomi per i valori noti al momento dello sviluppo, che introduciamo per una migliore manutenibilità e
- valori disponibili per il compilatore.
E poi c'è un terzo tipo correlato: variabili il cui valore non cambia, cioè i nomi di un valore. La differenza tra queste variabili immutabili e una costante è quando il valore è determinato / assegnato / inizializzato: una variabile viene inizializzata in fase di esecuzione, ma il valore di una costante è noto durante lo sviluppo. Questa distinzione è un po 'confusa dal momento che un valore può essere conosciuto durante lo sviluppo, ma in realtà viene creato solo durante l'inizializzazione.
Ma se il valore di una costante è noto in fase di compilazione, allora il compilatore può eseguire calcoli con quel valore. Ad esempio, il linguaggio Java ha il concetto di espressioni costanti . Un'espressione costante è qualsiasi espressione che consiste solo di valori letterali di primitive o stringhe, operazioni su espressioni costanti (come casting, addizione, concatenazione di stringhe) e di variabili costanti. [ JLS §15.28 ] Una variabile costante è un final
variabile che è inizializzata con un'espressione costante. [JLS §4.12.4] Quindi per Java, questa è una costante in fase di compilazione:
public static final int X = 7;
Questo diventa interessante quando una variabile costante viene utilizzata in più unità di compilazione e quindi la dichiarazione viene modificata. Prendere in considerazione:
Ora quando compiliamo questi file il B.class
bytecode dichiarerà un campo Y = 9
perché B.Y
è una variabile costante.
Ma quando cambiamo la variabile A.X
in un valore diverso (ad esempio, X = 0
) e ricompiliamo solo il file A.java
, allora B.Y
si riferisce ancora al vecchio valore. Questo stato A.X = 0, B.Y = 9
non è coerente con le dichiarazioni nel codice sorgente. Buon debugging!
Questo non significa che le costanti non dovrebbero mai essere cambiate. Le costanti sono definitivamente migliori dei numeri magici che appaiono senza spiegazione nel codice sorgente. Tuttavia, il valore delle costanti pubbliche è parte della tua API pubblica . Questo non è specifico di Java, ma si verifica anche in C ++ e in altri linguaggi che dispongono di unità di compilazione separate. Se cambi questi valori, dovrai ricompilare tutto il codice dipendente, cioè eseguire una compilazione pulita.
A seconda della natura delle costanti, potrebbero aver portato a supposizioni errate da parte degli sviluppatori. Se questi valori vengono modificati, potrebbero causare un errore. Ad esempio, un insieme di costanti può essere scelto in modo che formino determinati schemi di bit, ad es. %codice%. Se questi vengono modificati per formare una struttura diversa come public static final int R = 4, W = 2, X = 1
, il codice esistente come R = 0, W = 1, X = 2
diventa errato. E pensa al divertimento che ne deriverebbe se boolean canRead = perms & R
cambiasse! Non c'è alcuna correzione qui, è solo importante ricordare che il valore delle costanti alcune è davvero importante e non può essere modificato semplicemente.
Ma per la maggior parte delle costanti che li cambiano sta andando bene finché si considerano le restrizioni di cui sopra. Una costante è sicura da cambiare quando il significato, non il valore specifico è importante. Questo è ad es. il caso per i sintonizzabili come Integer.MAX_VALUE
o BORDER_WIDTH = 2
o modelli come TIMEOUT = 60; // seconds
- sebbene probabilmente alcuni o tutti quelli dovrebbero essere specificati nei file di configurazione piuttosto che nel codice.