Jedna praktyczna zasada: zadaj sobie pytanie „Czy sensowne jest wywoływanie tej metody, nawet jeśli żaden obiekt nie został jeszcze zbudowany?” Jeśli tak, zdecydowanie powinien być statyczny.
Więc w klasie Car
możesz mieć metodę:
double convertMpgToKpl(double mpg)
... który byłby statyczny, ponieważ można by chcieć wiedzieć, na co konwertuje 35mpg, nawet jeśli nikt nigdy go nie zbudował Car
. Ale ta metoda (która określa wydajność jednego konkretnego Car
):
void setMileage(double mpg)
... nie może być statyczny, ponieważ nie jest możliwe wywołanie metody, zanim Car
zostanie ona zbudowana.
(Nawiasem mówiąc, odwrotność nie zawsze jest prawdą: czasami możesz mieć metodę, która obejmuje dwa Car
obiekty i nadal chcesz, aby była statyczna. Np .:
Car theMoreEfficientOf( Car c1, Car c2 )
Chociaż można to przekonwertować na wersję niestatyczną, niektórzy twierdzą, że skoro nie ma „uprzywilejowanego” wyboru, który Car
jest ważniejszy, nie powinieneś zmuszać dzwoniącego do wybrania jednego Car
jako obiektu, który wywołasz metoda włączona. Ta sytuacja stanowi jednak niewielki ułamek wszystkich metod statycznych.)
Car#isMoreEfficientThan(Car)
. Ma tę zaletę, że samochód, który zwrócisz w remisie, nie jest arbitralny. Z tytułu metody wynika, co jest zwracane w remisie.Zdefiniuj metody statyczne tylko w następujących scenariuszach:
źródło
Istnieje kilka ważnych powodów, aby używać metod statycznych:
Wydajność : jeśli chcesz uruchomić jakiś kod i nie chcesz tworzyć instancji dodatkowego obiektu, umieść go w metodzie statycznej. JVM może również dużo zoptymalizować metody statyczne (myślę, że kiedyś przeczytałem Jamesa Goslinga, który oświadcza, że nie potrzebujesz niestandardowych instrukcji w JVM, ponieważ metody statyczne będą tak samo szybkie, ale nie mogą znaleźć źródła - dlatego to może być całkowicie fałszywe). Tak, to mikrooptymalizacja i prawdopodobnie niepotrzebna. A my programiści nigdy nie robimy niepotrzebnych rzeczy tylko dlatego, że są fajne, prawda?
Praktyczność : zamiast dzwonić
new Util().method(arg)
, dzwonićUtil.method(arg)
lubmethod(arg)
przy imporcie statycznym. Łatwiej, krócej.Dodawanie metod : naprawdę chciałeś, aby klasa String miała
removeSpecialChars()
metodę instancji, ale jej nie ma (i nie powinna, ponieważ znaki specjalne twojego projektu mogą różnić się od znaków innych projektów) i nie możesz jej dodać (od Java jest trochę rozsądny), więc tworzysz klasę użyteczności i wywołujeszremoveSpecialChars(s)
zamiasts.removeSpecialChars()
. Słodkie.Czystość : zachowując pewne środki ostrożności, twoja metoda statyczna będzie czystą funkcją , to znaczy, jedyne, na czym to zależy, to jej parametry. Dane wejściowe, dane wyjściowe. Jest to łatwiejsze do odczytania i debugowania, ponieważ nie musisz się martwić o dziwactwa związane z dziedziczeniem. Możesz to zrobić również za pomocą metod instancji, ale kompilator pomoże ci nieco bardziej za pomocą metod statycznych (nie zezwalając na odwołania do atrybutów instancji, metody zastępujące itp.).
Będziesz także musiał stworzyć metodę statyczną, jeśli chcesz stworzyć singleton, ale ... nie. Pomyśl dwa razy.
Co ważniejsze, dlaczego nie chcesz stworzyć metody statycznej? Zasadniczo polimorfizm wychodzi z okna . Nie będzie można zastąpić metody
ani zadeklarować jej w interfejsie(wcześniejszym niż Java 8) . Projekt wymaga dużej elastyczności. Ponadto, jeśli potrzebujesz stanu , skończysz z wieloma błędami współbieżności i / lub wąskimi gardłami, jeśli nie będziesz ostrożny.źródło
Po przeczytaniu artykułów Misko uważam, że metody statyczne są złe z testowego punktu widzenia. Zamiast tego powinieneś mieć fabryki (być może przy użyciu narzędzia do wstrzykiwania zależności, takiego jak Guice ).
jak mogę się upewnić, że mam tylko jedno z czegoś
Podstawowym problemem związanym z metodami statycznymi jest to, że są to kod proceduralny
źródło
Math.abs()
lubArrays.sort()
nawet metody, do których możesz przekazać wszystkie zależności , nie widzę, jak mogłoby to utrudnić testowanie jednostkowe. Powiedziałbym, że prosta ogólna zasada brzmi: jeśli kiedykolwiek miałbyś powód, by kpić z logiki proceduralnej, to nie poddawaj jej statycznej metodzie. Nigdy nie miałem powodu, żeby się wyśmiewaćArrays.sort()
lubMath.abs()
.static
Metoda jest jeden rodzaj metody, która nie wymaga żadnych przedmiotów być inicjowane na to, aby nazwać. Czy zauważyłeś, żestatic
jest używany wmain
funkcji w Javie? Wykonanie programu zaczyna się od tego momentu bez tworzenia obiektu.Rozważ następujący przykład:
źródło
Metody statyczne w Javie należą do klasy (a nie jej instancji). Nie używają zmiennych instancji i zwykle pobierają dane wejściowe z parametrów, wykonują na nim działania, a następnie zwracają jakiś wynik. Metody instancji są powiązane z obiektami i, jak sama nazwa wskazuje, mogą używać zmiennych instancji.
źródło
Nie, metody statyczne nie są powiązane z instancją; należą do klasy. Drugi przykład to metody statyczne; metody instancji są pierwsze.
źródło
Jeśli zastosujesz słowo kluczowe static przy użyciu dowolnej metody, jest to znane jako metoda static.
// Program zmiany wspólnej właściwości wszystkich obiektów (pole statyczne).
O / P: 111 Indyjski BBDIT 222 Amerykański BBDIT 333 Chiny BBDIT
źródło
Metody statyczne nie są powiązane z instancją, więc nie mogą uzyskać dostępu do żadnych pól niestatycznych w klasie.
Użyłbyś metody statycznej, jeśli metoda nie używa żadnych pól (lub tylko pól statycznych) klasy.
Jeśli używane są jakiekolwiek niestatyczne pola klasy, należy użyć metody niestatycznej.
źródło
Metody statyczne powinny być wywoływane w klasie, metody instancji powinny być wywoływane w instancjach klasy. Ale co to w rzeczywistości oznacza? Oto przydatny przykład:
Klasa samochodu może mieć metodę instancji o nazwie Accelerate (). Możesz przyśpieszyć samochód tylko wtedy, gdy samochód rzeczywiście istnieje (został zbudowany) i dlatego byłaby to metoda instancji.
Klasa samochodu może również mieć metodę count o nazwie GetCarCount (). Zwróciłoby to całkowitą liczbę samochodów wyprodukowanych (lub zbudowanych). Jeśli nie zbudowano żadnego samochodu, ta metoda zwróciłaby 0, ale nadal powinna być możliwa do wywołania, a zatem musiałaby być metodą statyczną.
źródło
W rzeczywistości używamy statycznych właściwości i metod w klasie, kiedy chcemy użyć jakiejś części naszego programu, powinna istnieć tam, dopóki nasz program nie zostanie uruchomiony. I wiemy, że do manipulowania właściwościami statycznymi potrzebujemy metod statycznych, ponieważ nie są one częścią zmiennej instancji. Bez metod statycznych manipulowanie właściwościami statycznymi jest czasochłonne.
źródło
Użyj metody statycznej, jeśli chcesz mieć dostęp do metody bez wystąpienia klasy.
źródło
Statyczny:
Obj.someMethod
Użyj,
static
gdy chcesz zapewnić dostęp do metody na poziomie klasy, tj. Tam, gdzie metoda powinna być możliwa do wywołania bez wystąpienia klasy.źródło
Metody statyczne nie muszą być wywoływane na obiekcie i wtedy go używasz. Przykład: twoja funkcja Main () jest statyczna i nie tworzysz obiektu do jej wywołania.
źródło
Metody statyczne i zmienne są kontrolowaną wersją funkcji i zmiennych „Globalnych” w Javie. W których metodach można uzyskać dostęp jako
classname.methodName()
lubclassInstanceName.methodName()
, tj. Metodach statycznych i zmiennych można uzyskać dostęp za pomocą nazwy klasy, a także instancji klasy.Klasy nie można zadeklarować jako statyczną (ponieważ nie ma to sensu. Jeśli klasa jest zadeklarowana publicznie, można uzyskać do niej dostęp z dowolnego miejsca), klasy wewnętrzne można zadeklarować jako statyczne.
źródło
Można zastosować metody statyczne, jeśli
Nie chce się wykonywać akcji na instancji (metody narzędziowe)
Chcemy użyć jako prostej funkcji. Dane wejściowe są jawnie przekazywane, a dane wynikowe są zwracane. Dziedziczenie, instanalizacja obiektu nie wchodzi w grę. Zwięzły, czytelny .
UWAGA : Niewielu ludzi sprzeciwia się testowalności metod statycznych, ale metody statyczne można również przetestować! Za pomocą jMockit można kpić z metod statycznych. Testability . Przykład poniżej:
źródło
Metody statyczne to metody w Javie, które można wywoływać bez tworzenia obiektu klasy. Należy do klasy.
Używamy metody statycznej, gdy nie trzeba wywoływać metody przy użyciu instancji.
źródło
static
metod jest dostęp dostatic
pól.Ale możesz mieć
static
metody bez odwoływania się dostatic
zmiennych. Metody pomocnicze bez odwoływania się dostatic
zmiennej można znaleźć w niektórych klasach Java, takich jak java.lang.MathInnym przypadkiem użycia, mogę pomyśleć o tych metodach w połączeniu z
synchronized
metodą jest implementacja blokowania na poziomie klasy w środowisku wielowątkowym.Jeśli potrzebujesz uzyskać dostęp do metody na obiekcie instancji klasy, twoja metoda powinna być niestatyczna.
Strona dokumentacji Oracle zawiera więcej szczegółów.
Nie wszystkie kombinacje zmiennych i metod instancji i klas są dozwolone:
źródło
A common use for static methods is to access static fields.
nie jest argument.Metoda statyczna ma dwa główne cele:
źródło
W Eclipse możesz włączyć ostrzeżenie, które pomaga wykryć potencjalne metody statyczne. (Powyżej podświetlonej linii znajduje się kolejna, o której zapomniałem zaznaczyć)
źródło
Ilekroć nie chcesz tworzyć obiektu w celu wywołania metody w kodzie, po prostu zadeklaruj tę metodę jako statyczną. Ponieważ metoda statyczna nie wymaga wywołania instancji, ale w tym przypadku catch nie wszystkie metody statyczne są wywoływane automatycznie przez JVM. Z tego przywileju korzysta tylko metoda main () „public static void main [String ... args]” w Javie, ponieważ w środowisku wykonawczym jest to metoda Signature public „static” void main [] poszukiwana przez JVM jako punkt wejścia do rozpocznij wykonywanie kodu.
Przykład:
Dane wyjściowe: - Ta metoda statyczna jest wykonywana przez JVM Ta metoda statyczna musi zostać wywołana jawnie Ta metoda statyczna musi zostać wywołana jawnie Ta metoda statyczna musi zostać wywołana jawnie
źródło