Aby odróżnić pola instancji i zmiennej lokalnej o tej samej nazwie możemy zakwalifikować dostęp do pola z prefiksem this.
:Przypisywanie statycznego do końcowego dziedzinie samej nazwie
class Test {
public final Foo x;
public Test(Foo x) {
this.x = x;
}
}
Próbuję zrobić to samo w statycznym kontekście przez kwalifikowanie dostępu z nazwą klasy:
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);
}
}
Kompilator nie chce mieć nic wspólnego z tym kodem. Mam kilka zmiennych takich jak ta i dla wszystkich z nich ciągle krzyczy: "nie można przypisać wartości do zmiennej końcowej". Jeśli I nie przypisuje do tego wartości, zamiast tego narzeka "zmienna nie zainicjowana". Jeśli przypiszę do pola statycznego na początku i postaram się, aby mapa stała się niemożliwa do zmodyfikowania, narzeka, że "zmienna mogła już zostać przypisana". Nie jest z niczego zadowolony.
Czy to błąd w języku, czy błąd w kompilatorze? Jaki jest najlepszy sposób, aby zmusić kompilator do działania zgodnie z poleceniem?
Użyj dwóch różnych nazw. Nie ma powodu, aby 'mapa' wewnątrz bloku statycznego miała taką samą nazwę jak statyczne pole' map'. – ajb
Zmiana nazwy działa, ale jest brzydka, ponieważ wielokrotnie używam zmiennych w bloku inicjalizatora i będą one bardziej znaczące z ich własnymi nazwami. Zastanawiałem się, czy było coś lepszego. – Boann