Per distinguere tra un campo di istanza e una variabile locale con lo stesso nome che possiamo qualificare l'accesso al campo con il prefisso this.
:Assegnare al campo finale statico del omonimo
class Test {
public final Foo x;
public Test(Foo x) {
this.x = x;
}
}
che sto cercando di fare la stessa cosa in un contesto statico qualificando l'accesso con il nome della classe:
import java.util.*;
class Test {
public static final Map<String,Object> map;
static {
Map<String,Object> map = new HashMap<>();
// ...
// assume I fill the map with useful data here
// ...
// now I want to freeze it and assign it to the field
Test.map = Collections.unmodifiableMap(map);
}
}
il compilatore non vuole avere niente a che fare con questo codice. Ho diverse variabili come questa e per tutte loro continua a urlare: "non posso assegnare un valore alla variabile finale". Se I non lo assegna a, si lamenta invece "variabile non inizializzata". Se assegno il campo statico all'inizio e cerco di rendere la mappa non modificabile in seguito, si lamenta che "la variabile potrebbe essere già stata assegnata". Non è contento di nulla.
È un difetto nella lingua o un errore nel compilatore? Qual è il modo migliore per fare in modo che il compilatore si comporti nel modo in cui viene detto?
Utilizzare due nomi diversi. Non c'è motivo per cui la 'map' all'interno del blocco statico debba avere lo stesso nome del campo' map' statico. – ajb
Rinominare funziona, ma è brutto, perché uso le variabili più volte nel blocco di inizializzazione e sarebbero più significativi con i loro nomi propri. Mi stavo chiedendo se ci fosse qualcosa di meglio. – Boann