Historia kwestii:
Od samego początku w Javie pojawiła się koncepcja statycznych członków klasy, różniących się od członków instancyjnych — takie zmienne są przechowywane na poziomie klasy, a nie obiektu. Umożliwia to dzielenie danych między wszystkimi instancjami klasy lub wykorzystywanie stałych i struktur serwisowych.
Problem:
Głównym celem pól statycznych jest dostarczenie danych dla wszystkich obiektów klasy lub realizacja jedynego punktu dostępu. Jednak niewłaściwe użycie static może prowadzić do trudnych do wykrycia błędów związanych z globalnym stanem, wyścigami danych i problemami podczas testowania.
Rozwiązanie:
Pola statyczne deklaruje się za pomocą słowa kluczowego static:
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
Przy każdym tworzeniu instancji licznik wzrasta, a wartość jest dostępna za pomocą Counter.globalCount, niezależnie od obiektu.
Kluczowe cechy:
Czy można uzyskać dostęp do pola statycznego przez obiekt, a nie przez nazwę klasy?
Tak, składnia pozwala na dostęp do pola statycznego przez obiekt, jednak prowadzi to do nieczytelnego, a czasem i mylącego kodu. Lepiej zawsze odwoływać się przez nazwę klasy.
Counter c = new Counter(); System.out.println(c.globalCount); // Działa, ale nie jest zalecane
Czy pola statyczne mogą być prywatne?
Tak, poziom dostępu nie jest w żaden sposób ograniczony. Prywatne pola statyczne często są używane razem z publicznymi metodami statycznymi (na przykład dla Singleton):
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
Co się stanie, gdy spróbujesz zainicjować pole statyczne wartością zależną od niestatycznego?
Taki kod nie skompiluje się, ponieważ pola niestatyczne są inicjowane po polach statycznych. Pole statyczne nie może odwoływać się do niestatycznego bezpośrednio.
W dużych aplikacjach używa się pola static do przechowywania danych z pamięci podręcznej, które są specyficzne dla użytkownika.
Zalety:
Wady:
Użycie public static final String do przechowywania stałych (na przykład kodów błędów lub standardowych parametrów).
Zalety:
Wady: