Ostatnio zacząłem programować w Groovy dla środowiska testowego integracji, dla projektu Java. Używam Intellij IDEA z wtyczką Groovy i jestem zaskoczony, widząc ostrzeżenie dla wszystkich metod, które są niestatyczne i nie zależą od pól instancji. Jednak w Javie nie stanowi to problemu (przynajmniej z punktu widzenia IDE).
Czy wszystkie metody, które nie zależą od pól instancji, powinny zostać przekształcone w funkcje statyczne? Jeśli prawda, czy jest to specyficzne dla Groovy, czy ogólnie jest dostępne dla OOP? I dlaczego?
Odpowiedzi:
Pamiętaj, że IDEA ma również tę inspekcję w Javie, nazywa się to Metoda może być „statyczna” ,
Rzecz w tym, że w przypadku kodu Java ta kontrola jest domyślnie wyłączona (programiści mogą ją włączyć według własnego uznania). Powodem tego jest najprawdopodobniej, że ważność / przydatność takiej inspekcji mogłaby zostać zakwestionowana na podstawie kilku dość wiarygodnych źródeł.
Na początek oficjalny samouczek Java jest raczej ograniczony, kiedy metody powinny być statyczne:
Biorąc pod uwagę powyższe, można argumentować, że włączenie domyślnie wspomnianej kontroli nie jest zgodne z zalecanym użyciem modyfikatora statycznego w Javie.
Poza tym istnieje kilka innych źródeł, które sięgają tak daleko, że sugerują rozsądne podejście do korzystania z pomysłów leżących u podstaw tej kontroli, a nawet zniechęcają ją.
Zobacz na przykład artykuł Java World - Mr. Happy Object uczy metod statycznych :
Artykuł na blogu testowym Google mówi nawet, że metody statyczne to śmierć na testowalność :
Widzisz, biorąc pod uwagę powyższe, wydaje się naturalne, że wspomniana inspekcja jest domyślnie wyłączona w Javie.
Deweloperzy IDE miałoby naprawdę trudno wyjaśnić, dlaczego uważają, że tak ważne jest, aby ustawić go na domyślnie przeciwko powszechnie uznanych zaleceń i najlepszych praktyk.
W przypadku Groovy sprawy wyglądają zupełnie inaczej. Żaden z wyżej wymienionych argumentów nie ma zastosowania, szczególnie ten dotyczący testowalności, jak wyjaśniono np. W Mocking Static Methods w artykule Groovy w Javalobby:
Ta różnica jest prawdopodobna, dlaczego domyślne ustawienie wspomnianej kontroli jest odwrotne w Groovy. Podczas gdy w Javie domyślne „włączone” byłoby źródłem zamieszania wśród użytkowników, w Groovy przeciwne ustawienie mogłoby pomylić użytkowników IDE.
„Hej, metoda nie wykorzystuje pól instancji, dlaczego mnie przed tym nie ostrzegłeś?” Odpowiedź na to pytanie byłaby łatwa w przypadku Javy (jak wyjaśniono powyżej), ale w przypadku Groovy nie ma żadnego przekonującego wyjaśnienia.
źródło
Trudno sobie wyobrazić, aby miałoby to jakikolwiek zauważalny wpływ na wydajność. Jedyną korzyścią, jaką widzę, gdy je robię,
static
jest to, że zapewnia wizualne wskazanie, że nie ma to wpływu na stan instancji. Innymi słowy, mówi osobie czytającej kod źródłowy coś ... „interesującego” o tej metodzie, tylko dlatego, że tam jest. Prawdziwe pytanie brzmi: czy to wyjaśnia, czy dezorientuje? „Dlaczego ta metoda jest statyczna? Czy jest to metoda fabryczna? Czy potrzebna jest możliwość wywoływania jej bez instancji obiektu?”Ponadto niektórzy ludzie nie lubią metod statycznych, ponieważ twierdzą, że nie można ich wyśmiewać, a zatem nie można ich przetestować lub coś w tym stylu. Oczywiście, jeśli ustawisz go na statyczny z któregokolwiek ze zwykłych powodów, takich jak na przykład dostarczenie metody fabrycznej, to jestem za tym wszystkim. Nie jestem do końca pewien, czy uczynienie metod statycznymi tylko dlatego, że nie dotykają stanu instancji, jest mandatem.
źródło
final
zaprojektowane lub specjalnie zaprojektowane z myślą o dziedziczeniu.Myślę, że jest umożliwienie ewentualnego refaktoryzacji zostać zauważony .
Gdy metoda stanie się statyczna, jasne jest , że można ją przenieść z klasy, powiedzmy do klasy jedności.
Łatwo jest również przekształcić go w metodę instancji jednego z jego parametrów, często tam powinien być kod.
źródło
Zauważ, że możesz mieć klasy bezstanowe, które implementują jakiś interfejs (np.
java.lang.Runnable
- nie możesz ustawić ich metod na statyczne. Niektóre wzorce (np. Strategia) mogą również tworzyć bezstanowe obiekty, które mogą mieć nawet kilka metod.Statyka jest pierwszą kuzynką singletonów. Naprawdę ciężko będzie przejść ze statyki do niestatyki w późniejszym momencie - więc kiedy będziesz musiał dodać stan, będziesz miał ochotę zacząć wprowadzać zmienne statyczne.
źródło