rozszerzyć nieco na Odpowiedź Michaela, spodziewam się, że jest tam, aby zapewnić, że metoda keySet()
nigdy nie zwróci null
, być może oprócz zapewnienia korzyści wydajności zauważyć.
Biorąc pod uwagę ten kod:
public Set<K> keySet() {
return (keySet == null ? (keySet = new KeySet()) : keySet;
}
Byłoby przynajmniej teoretycznie możliwe w kodzie wielowątkowym, że pole keySet
może być ustawiony na null
pomiędzy pierwszym odczycie (keySet == null
) i drugim czytać, gdzie go jest zwracany. Nie spojrzałem na resztę kodu, ale zakładam, że są inne miejsca, gdzie keySet
jest potencjalnie przypisany null
. Niezależnie od tego, czy dzieje się to w wyniku problemu obserwowanego w środowisku naturalnym, czy też środka obronnego, będzie to pytanie dla autorów.
Rzeczywisty kod:
public Set<K> keySet() {
Set<K> ks;
return (ks = keySet) == null ? (keySet = new KeySet()) : ks;
}
... nie ma tego problemu, ponieważ pole jest odczytywany tylko raz.
Może; chociaż wygląda na to, że próbuje ustawić zmienną na poziomie klasy, zapewniając, że zmienna nie jest pusta i zwraca tę wartość. Jednak nie mam o tym pojęcia. Musiałbym popatrzeć na całą klasę. –
Być może dla jasności intencji – alphablue
Może być uważany za duplikat http://stackoverflow.com/q/28975415/3182664 http://stackoverflow.com/q/2785964/3182664 http://stackoverflow.com/q/ 37776179/3182664 http://stackoverflow.com/q/32619269/3182664 i prawdopodobnie kilka innych ... – Marco13