Historia pytania:
Import statyczny został wprowadzony w Javie 5 (JDK 1.5) w celu zwiększenia czytelności kodu i zmniejszenia jego rozwlekłości. Przed wprowadzeniem tego mechanizmu, aby używać statycznych członów innej klasy, zawsze trzeba było pisać pełną nazwę klasy, co czyniło kod ciężkim i mniej zrozumiałym.
Problem:
Często zachodzi potrzeba wielokrotnego odwoływania się do statycznych metod lub pól w ramach jednej klasy (na przykład do funkcji matematycznych lub stałych). Stałe wspominanie o nazwie klasy utrudnia czytelność i zwiększa ilość kodu.
Rozwiązanie:
Mechanizm importu statycznego pozwala na importowanie statycznych członów klasy (metod lub pól) bezpośrednio, aby można było się do nich odwoływać bez prefiksu z nazwą klasy. Ułatwia to kod i czyni go bardziej zwartym, szczególnie przy intensywnym używaniu bibliotek takich jak Math.
Przykład kodu:
import static java.lang.Math.*; public class StaticImportExample { public static void main(String[] args) { double x = cos(PI * 2); double y = pow(2, 4); System.out.println(x + ", " + y); } }
Kluczowe cechy:
Czy można zaimportować wszystkie statyczne człony klasy za pomocą gwiazdki (Wildcard Static Import)?
Tak, można. Wyrażenie import static java.lang.Math.*; importuje wszystkie statyczne metody i pola tej klasy. Ale to pogarsza czytelność i może powodować konflikty nazw, jeśli takie występują w innych importowanych klasach.
Czy można zaimportować statyczne człony nieistniejącej klasy?
Nie, kompilator zgłosi błąd. Na przykład,
import static java.util.List.NONEXISTENT_FIELD; // Błąd kompilacji
Czy działa static import dla niestatycznych członów klasy?
Nie. Static import odnosi się tylko do statycznych metod i pól. Próba zaimportowania niestatycznych członów spowoduje błąd kompilacji.
*) zmniejsza czytelność i prowadzi do konfliktów nazwProgramista w zespole używa import static java.lang.Math.*; i import static java.util.Collections.*;, nie zwracając uwagi na kolizję nazw. W rezultacie trudno zrozumieć, która metoda lub stała jest używana w każdym konkretnym miejscu, a przy pojawieniu się nowych bibliotek — mogą wystąpić konflikty nazw.
Plusy:
Minusy:
Programista importuje tylko potrzebne metody z Math, na przykład
import static java.lang.Math.PI; import static java.lang.Math.cos;
Cały projekt pozostaje zrozumiały i łatwy w utrzymaniu, statyczne importowane człony są łatwe do śledzenia.
Plusy:
Minusy: