PDA

Visualizza la versione completa : [JAVA] I campi 'static'


Gil Mour
19-10-2004, 23:13
Mi sono sempre chiesto quando, dove e per quanto tempo i valori final static dichiarati nelle classi vivano.

Mi sono accorto oggi per la prima volta nella mia vita di una cosa un po strana: ho una classe S che contiene dei campi statici, e due classi A e B che li utilizzano.

Ora, diciamo che io interrompo completamente l'applicazione, apro il sorgente di S e modifico solo i valori di alcune di quelle costanti.

Se non ricompilo A e B, queste continueranno a riferirsi ai valori vecchi della classe S.

Quindi quello che volevo chiedere č, anche per sommi capi, il ciclo di vita di una variabile statica. Quello che mi aspettavo nel mio piccolo era che questi valori venivano in qualche modo allocati nella jvm per la durata di una esecuzione che li referenzia, ma al termine della sessione corrente della jvm questi venissero 'azzerati' e riallocati nuovamente al riavviarsi della jvm stessa.

Invece pare evidente che vengono anche scritti nel byte code delle classi esterne che vi si riferiscono.

Pareri autorevoli ( e non :) )?

LeleFT
20-10-2004, 09:29
Ho effettuato una prova ed ho evidenziato la stessa anomalia: credo proprio che nel bytecode delle classi che usano i campi statici vengano inseriti i valori dei campi. Bisognerebbe farlo presente a Sun.


Ciao. :ciauz:

netarrow
20-10-2004, 16:30
Originariamente inviato da LeleFT
Ho effettuato una prova ed ho evidenziato la stessa anomalia: credo proprio che nel bytecode delle classi che usano i campi statici vengano inseriti i valori dei campi. Bisognerebbe farlo presente a Sun.


Ciao. :ciauz:

La sun lo sa, infatti in Java 5 sono state aggiunge le enum e valori per le costanti, ora potresti usare(con Java 5) un codice tipo:



public enum Enumerazione {
COSTANTE(1000), COSTANTE2(1002);
private final int value;

private Enumerazione(int value) {
this.value = value;
}

public int value() {
return value;
}

}


e chiamare con:



...
Enumerazione e = Enumerazione.COSTANTE;
...


e prenderne il valore col metodo value, ecco un esempio:



System.out.println(e + " " + e.value());


N.B se stampi il nome dell'enumerazione viene scritto il suo nome
da costante, qui verrā come output:
COSTANTE 1000


:ciauz:

LeleFT
20-10-2004, 16:44
Mah... č una cosa piuttosto brutta che non si riesce ad inquadrare proprio nella programmazione Object Oriented... rimane il fatto che le applicazioni giā esistenti soffrono del problema evidenziato.


Ciao. :ciauz:

Loading