Właśnie dostałem komentarz recenzji, że mój statyczny import metody nie był dobrym pomysłem. Import statyczny był metodą z klasy DA, która zawiera głównie metody statyczne. Tak więc w środku logiki biznesowej miałem aktywność da, która najwyraźniej wydawała się należeć do obecnej klasy:
import static some.package.DA.*;
class BusinessObject {
void someMethod() {
....
save(this);
}
}
Recenzentowi nie zależało na tym, żebym zmienił kod i nie zrobiłem, ale w pewnym sensie się z nim zgadzam. Jednym z powodów braku importu statycznego było mylące miejsce, w którym metoda została zdefiniowana, nie znajdowała się ona w bieżącej klasie ani w żadnej nadklasie, więc zidentyfikowanie jej definicji zajęło trochę czasu (internetowy system recenzji nie ma klikalnego linki takie jak IDE :-) Nie sądzę, żeby to miało znaczenie, statyczne importy są wciąż całkiem nowe i wkrótce wszyscy przyzwyczaimy się do ich lokalizowania.
Ale innym powodem, z którym się zgadzam, jest to, że niekwalifikowane wywołanie metody wydaje się należeć do bieżącego obiektu i nie powinno przeskakiwać kontekstów. Ale gdyby tak naprawdę należało, rozszerzenie tej superklasy miałoby sens.
Tak więc, gdy ma ona sensu statycznych metod importu? Kiedy to zrobiłeś? Czy podobał Ci się wygląd niekwalifikowanych połączeń?
EDYCJA: Popularna opinia wydaje się być taka, że metody statycznego importu, jeśli nikt nie pomyli ich z metodami bieżącej klasy. Na przykład metody z java.lang.Math i java.awt.Color. Ale jeśli abs i getAlpha nie są niejednoznaczne, nie rozumiem, dlaczego readEmployee jest. Podobnie jak w przypadku wielu wyborów programistycznych, myślę, że jest to kwestia osobistych preferencji.
Dziękuję za odpowiedź, zamykam pytanie.
źródło
import static
taka, funkcja tostatic import
Odpowiedzi:
To pochodzi z przewodnika firmy Sun, kiedy wydali tę funkcję (podkreślenie w oryginale):
( https://docs.oracle.com/javase/8/docs/technotes/guides/language/static-import.html )
Są dwie części, które chcę szczególnie podkreślić:
extend some.package.DA
? Jeśli tak, import statyczny może być czystszym sposobem radzenia sobie z tym. Jeśli nigdy nie marzyłbyś o rozszerzeniusome.package.DA
, prawdopodobnie jest to słabe wykorzystanie importu statycznego. Nie używaj go tylko do zapisywania kilku znaków podczas pisania.import static some.package.DA.save
zamiastDA.*
. To znacznie ułatwi ustalenie, skąd pochodzi ta importowana metoda.Osobiście używałem tej funkcji języka bardzo rzadko i prawie zawsze tylko ze stałymi lub wyliczeniami, nigdy z metodami. Dla mnie taki kompromis prawie nigdy nie jest tego wart.
źródło
Innym sensownym zastosowaniem importu statycznego jest JUnit 4. We wcześniejszych wersjach JUnit metody takie jak
assertEquals
ifail
były dziedziczone od czasu rozszerzenia klasy testowejjunit.framework.TestCase
.W JUnit 4 klasy testowe nie muszą się już rozszerzać
TestCase
i zamiast tego mogą używać adnotacji. Następnie możesz statycznie zaimportować metody assert zorg.junit.Assert
:JUnit dokumenty używając go w ten sposób.
źródło
Effective Java, Second Edition , na końcu punktu 19 zauważa, że możesz użyć statycznego importu, jeśli intensywnie używasz stałych z klasy narzędziowej. Myślę, że ta zasada miałaby zastosowanie do statycznego importu zarówno stałych, jak i metod.
Ma to zalety i wady. Dzięki temu kod jest nieco bardziej czytelny kosztem utraty niektórych natychmiastowych informacji o tym, gdzie zdefiniowano metodę. Jednak dobre IDE pozwoli ci przejść do definicji, więc nie stanowi to większego problemu.
Powinieneś nadal używać tego oszczędnie i tylko wtedy, gdy często używasz rzeczy z importowanego pliku.
Edycja: Zaktualizowano, aby bardziej szczegółowo określać metody, ponieważ właśnie do tego odnosi się to pytanie. Zasada ma zastosowanie niezależnie od tego, co jest importowane (stałe lub metody).
źródło
UtilityClassWithFrequentlyUsedMethods
trzeba je skrócić.double myPI = Math.PI;
a potem mogę po prostu odnosić się domyPI
zamiastMath.PI
.Zgadzam się, że mogą być problematyczne z punktu widzenia czytelności i powinny być używane oszczędnie. Ale używając zwykłej metody statycznej, mogą w rzeczywistości zwiększyć czytelność. Na przykład w klasie testowej JUnit metody takie jak
assertEquals
są oczywiste, skąd pochodzą. Podobnie dla metod zjava.lang.Math
.źródło
sin x cos y + cos x sin y
. W Java staje się:Math.sin(x) * Math.cos(y) + Math.cos(x) * Math.sin(y)
. Straszne do przeczytania.using
dyrektywy w C ++: mogą być lokalne .Myślę, że import statyczny jest naprawdę przydatny do usuwania zbędnych nazw klas podczas używania klas narzędzi takich jak
Arrays
iAssertions
.Nie jestem pewien, dlaczego, ale Ross pominął ostatnie zdanie, które wspomina o tym w dokumentacji, do której się odwołuje .
Zasadniczo skopiowane z tego bloga: https://medium.com/alphadev-hardts/static-imports-are-great-but-underused-e805ba9b279f
Na przykład:
Asercje w testach
Jest to najbardziej oczywisty przypadek, z którym wszyscy się zgadzamy
Wykorzystuje klasy i wyliczenia
Nazwę klasy można usunąć w wielu przypadkach, gdy używa się klas narzędzi ułatwiających odczytanie kodu
Pakiet java.time ma kilka przypadków, w których powinien być używany
Przykład, kiedy nie używać
źródło
Często używam go do koloru.
Jest bardzo mało prawdopodobne, aby kolory zostały pomylone z czymś innym.
źródło
Polecam korzystanie z importem statycznym przy użyciu OpenGL z Java, który jest use-case należących do „intensywnego użytkowania stałych z klasy narzędzie” kategorii
Rozważ to
pozwala na przeniesienie oryginalnego kodu C i napisanie czegoś czytelnego, takiego jak:
zamiast tej powszechnej brzydoty:
źródło
Import statyczny to jedyna „nowa” funkcja Javy, której nigdy nie używałem i nie zamierzam nigdy używać z powodu problemów, o których wspomniałeś.
źródło
Używam 'import static java.lang.Math. *' Podczas przenoszenia ciężkiego kodu matematycznego z C / C ++ do Java. Metody matematyczne odwzorowują od 1 do 1 i ułatwiają porównywanie przenoszonego kodu bez kwalifikowania nazwy klasy.
źródło
Okazało się, że jest to bardzo wygodne podczas korzystania z klas Utility.
Na przykład zamiast używać:
if(CollectionUtils.isNotEmpty(col))
Zamiast tego mogę:
Która IMO zwiększa czytelność kodu, gdy używam tego narzędzia wiele razy w moim kodzie.
źródło
Mówiąc o testach jednostkowych: większość ludzi używa statycznych importów dla różnych statycznych metod, które zapewniają symulujące struktury, takie jak
when()
lubverify()
.I oczywiście, gdy używasz jedynego potwierdzenia, którego powinieneś używać
assertThat()
, przydaje się on do statycznego importowania wymaganych dopasowań ścięgien podkolanowych, jak w:źródło
Przydają się do ograniczenia słownictwa, szczególnie w przypadkach, gdy wywoływanych jest wiele metod importowanych, a rozróżnienie między metodami lokalnymi i importowanymi jest wyraźne.
Jeden przykład: kod, który zawiera wiele odwołań do java.lang.Math
Inna: klasa konstruktora XML, w której dołączenie nazwy klasy do każdego odwołania ukrywałoby budowaną strukturę
źródło
Myślę, że import statyczny jest odpowiedni dla NLS w stylu gettext.
To zarówno oznacza ciąg jako ciąg, który ma zostać wyodrębniony, jak i zapewnia łatwy i czysty sposób na zastąpienie łańcucha jego tłumaczeniem.
źródło
Statyczny import IMO to całkiem fajna funkcja. Jest absolutnie prawdą, że duże poleganie na imporcie statycznym sprawia, że kod jest nieczytelny i trudny do zrozumienia, do której klasy należy statyczna metoda lub atrybut. Jednak z mojego doświadczenia wynika, że staje się użyteczną cechą, zwłaszcza przy projektowaniu
Util
klas, które zapewniają statyczne metody i atrybuty. Niejednoznaczność pojawiającą się podczas zapewniania importu statycznego można obejść, ustanawiając standardy kodu. Z mojego doświadczenia w firmie takie podejście jest akceptowalne i sprawia, że kod jest czystszy i łatwy do zrozumienia. Najlepiej wstawiam_
znak przed metodami statycznymi i atrybutami statycznymi (jakoś przejęte z C). Wygląda na to, że takie podejście narusza standardy nazewnictwa Javy, ale zapewnia przejrzystość kodu. Na przykład, jeśli mamy klasę AngleUtils:W tym przypadku import statyczny zapewnia przejrzystość, a struktura kodu wygląda dla mnie bardziej elegancko:
Od razu ktoś może powiedzieć, która metoda lub atrybut pochodzi ze statycznego importu i ukrywa informacje o klasie, do której należy. Nie sugeruję używania importu statycznego dla klas, które są integralną częścią modułu i zapewniają metody statyczne i niestatyczne, ponieważ w tym przypadku ważne jest, aby wiedzieć, która klasa zapewnia określoną funkcjonalność statyczną.
źródło
H_
import zHelper
klasy użytkowej, którą mam, lubC_
dlaCommon
, lubU_
dlaUtility
. Alternatywnie, rozważałem użycie jednej lub dwóch nazw klas znaków dla tych szeroko używanych klas, ale obawiałem się, że mogą one czasami kolidować z nazwami lokalnymi - mają jakiś starszy kod z nazwami metod pisanymi wielkimi literami.Musisz ich używać, gdy:
switch
instrukcji z wartościami wyliczeniowymiźródło
Używam ich, kiedy tylko mogę. Mam konfigurację IntelliJ, która przypomina mi, jeśli zapomnę. Wydaje mi się, że wygląda na znacznie czystszy niż w pełni kwalifikowana nazwa pakietu.
źródło