Nie do końca prywatne pola

Koziołek

Modyfikator dostępu private oznacza iż dane pole nie jest dostępne na zewnątrz klasy. Jeżeli jednak przyjrzymy się dokładniej temu problemowi to dojdziemy do zaskakujacego wniosku. Pole przywatne nie zawsze jest całkowicie niedostępne. Przykład bezpiecznego, wielowątkowego singletonu z leniwą inicjalizacją:

public class Singleton
{ 
  private Singleton() {}
 
  private static class SingletonHolder
  { 
    private final static Singleton INSTANCE = new Singleton();
  }
 
  public static Singleton getInstance()
  {
    return SingletonHolder.INSTANCE;
  }
}

źródło: http://en.wikipedia.org/wiki/Singleton_pattern#Java
Jak się okazuje prywatne pole INSTANCE prywatnej klasy SingletonHolder jest widoczne dla klasy Singleton. I wszytko jest dobrze ponieważ rzeczywistym właścielem pola jest klasa Singleton. Wynika to nie z modyfikatora dostępu, ale ze statycznego charakteru zarówno SingletonHolder jak i INSTANCE.

Ot mała ciekawostka...

2 komentarzy

rzecz w tym że TiJ 4ed jest książką stosunkowo nową. Poza tym idąc tokiem myślenia, że to jest w takiej a takiej książce, wystarczyło by sporządzić listę tematów z odsyłaczami do książek. Swoja drogą muszę się w końcu przełamać i przejrzeć TiJ4

Ta "mała ciekawostka" jest opisana w książce Thinking in Java 4th Edition więc nic nowego (przynajmniej dla mnie). Bardzo polecam tą książkę ponieważ są opisane wszystkie zagadnienia potrzebne początkującemu i średnio-zaawansowanemu programiście.