Dlaczego używanie dzikiej karty z instrukcją importu Javy jest złe?

O wiele wygodniej i czystiej jest używać jednej instrukcji, takiej jak

import java.awt.*;

Niż zaimportować kilka klas indywidualnych

import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...

Co jest złego w używaniu wildcard w import oświadczenie?

Author: Radu Murzea, 2008-09-29

13 answers

Jedynym problemem jest to, że zaśmieca lokalną przestrzeń nazw. Na przykład, załóżmy, że piszesz aplikację Swing, a więc potrzebujesz java.awt.Event, a także współpracujesz z systemem kalendarza firmy, który ma com.mycompany.calendar.Event. Jeśli zaimportujesz oba za pomocą metody wildcard, dzieje się jedna z tych trzech rzeczy:

  1. masz konflikt nazw pomiędzy java.awt.Event i com.mycompany.calendar.Event, więc nie możesz nawet skompilować.
  2. W rzeczywistości udało Ci się zaimportować tylko jeden (tylko jeden z dwóch imports does .*), ale jest zły, i trudno zrozumieć, dlaczego twój kod twierdzi, że typ jest zły.
  3. podczas kompilacji kodu nie ma com.mycompany.calendar.Event, ale gdy później dodają jeden, twój wcześniej poprawny kod nagle przestaje kompilować.

Zaletą jawnej listy wszystkich importów jest to, że na pierwszy rzut oka mogę powiedzieć, jakiej klasy chcesz użyć, co po prostu ułatwia czytanie kodu. Jeśli robisz tylko szybką jednorazową rzecz, jest nic wyraźnie źle, ale przyszli opiekunowie będą Ci wdzięczni za Twoją jasność w przeciwnym razie.

 382
Author: Benjamin Pollack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 13:31:37

Oto głos na import gwiazd. Deklaracja importu jest przeznaczona do importu pakietu , a nie Klasy. Import całych pakietów jest o wiele czystszy; zidentyfikowane tutaj problemy (np. java.sql.Date vs java.util.Date) są łatwo rozwiązywane innymi środkami, a nie naprawdę rozwiązywanymi przy pomocy konkretnych importów i z pewnością nie uzasadniają szalenie pedantycznego importu wszystkich klas. Nie ma nic bardziej niepokojącego niż otwarcie pliku źródłowego i konieczność strony przez import 100 Oświadczenia.

Wykonywanie specyficznego importu utrudnia refaktoryzację; jeśli usuniesz/zmienisz nazwę klasy, musisz usunąć Wszystkie z jej specyficznego importu. Jeśli przełączysz implementację na inną klasę w tym samym pakiecie, musisz naprawić import. Podczas gdy te dodatkowe kroki mogą być zautomatyzowane, są one naprawdę hitów produktywności bez realnego zysku.

Nawet gdyby Eclipse domyślnie nie importowało klas, wszyscy nadal by importowali Gwiazdy. Przepraszam, ale naprawdę nie ma racjonalnego uzasadnienia dla dokonania konkretnego importu.

Oto jak radzić sobie z konfliktami klasowymi:

import java.sql.*;
import java.util.*;
import java.sql.Date;
 154
Author: davetron5000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-28 08:09:40

Proszę zapoznać się z moim artykułem Import on Demand is Evil

W skrócie, największym problemem jest to, że Twój kod może się zepsuć, gdy klasa jest Dodana do importowanego pakietu. Na przykład:

import java.awt.*;
import java.util.*;

// ...

List list;

W Javie 1.1 było to w porządku; lista została znaleziona w Javie.awt i nie było konfliktu.

Teraz Załóżmy, że sprawdzasz swój doskonale działający kod, a rok później ktoś inny przynosi go do edycji i używa Javy 1.2.

Java 1.2 dodała listę nazw interfejsu do Javy.util. Bum! Konflikt. Doskonale działający kod już nie działa.

To jest zła funkcja językowa. Nie ma powodu, dla którego kod powinien przestać kompilować tylko dlatego, że typ jest dodany do pakietu...

Dodatkowo, czytelnikowi trudno jest określić, którego " Foo " używasz.
 133
Author: Scott Stanchfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-10 11:24:22

To jest nie źle używać dzikiej karty z instrukcją Java import.

W Clean Code Robert C. Martin zaleca używanie ich w celu uniknięcia długich list importowych.

Oto zalecenie:

J1: unikaj długich list importowych, używając Wildcards

Jeśli używasz dwóch lub więcej klas z pakiet, a następnie Importuj cały pakiet z

Import pakietu.*;

Długie listy importu zniechęcają do na czytelniku. Nie chcemy zaśmiecać w górę naszych modułów z 80 linie importowe. Raczej chcemy import to zwięzłe stwierdzenie o jakich pakietach współpracujemy z.

Specyficzny przywóz jest trudny zależności, natomiast import wildcard nie są. Jeśli konkretnie importujesz Klasa, więc ta klasa musi istnieć. Ale jeśli importujesz pakiet z wildcard, nie trzeba specjalnych klas istnieć. Oświadczenie o imporcie dodaje pakiet do wyszukiwania ścieżka podczas polowania na nazwiska. Więc nie ma prawdy zależność jest tworzona przez takie importowanie, i dlatego służą naszym Moduły mniej sprzężone.

Są czasy, kiedy długa lista konkretny przywóz może być przydatny. Na przykład, jeśli masz do czynienia z legacy code i chcesz się dowiedzieć jakie klasy trzeba budować i stuby Dla, można iść w dół wykaz specyficznych przywozów, aby dowiedzieć się prawdziwymi kwalifikowanymi nazwami tych wszystkich klas, a następnie umieścić odpowiednie stuby na miejscu. Jednak to zastosowanie do przywóz specyficzny jest bardzo rzadki. Ponadto większość nowoczesnych IDE będzie pozwala na konwersję przywóz do wykazu przywozu indywidualnego jednym poleceniem. Więc nawet w legacy case lepiej zaimportować wildcards.

Import symboli wieloznacznych może czasami powodować konflikty nazw i niejasności. Dwa klasy o tej samej nazwie, ale w różne pakiety, będą musiały być specjalnie importowane, a przynajmniej specjalnie kwalifikowany, gdy jest używany. To może być uciążliwe, ale jest wystarczająco rzadkie że używanie zaimków wieloznacznych jest nadal ogólnie lepsze niż konkretne import.

 62
Author: hwiechers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 06:34:27

To zaśmieca przestrzeń nazw, wymagając od Ciebie pełnego określenia nazw klas, które są niejednoznaczne. Najczęściej występuje z:

import java.util.*;
import java.awt.*;

...
List blah; // Ambiguous, needs to be qualified.

Pomaga również w uszczegółowieniu zależności, ponieważ wszystkie zależności są wymienione na górze pliku.

 20
Author: hazzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 04:05:04

Wydajność: Brak wpływu na wydajność, ponieważ kod bajtowy jest taki sam. chociaż doprowadzi to do pewnych ogólnych kosztów kompilacji.

Kompilacja: na moim osobistym komputerze Kompilacja pustej klasy bez importowania czegokolwiek zajmuje 100 ms, ale ta sama klasa podczas importowania Javy.* trwa 170 ms.

 15
Author: Vinish Nain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-06 18:21:25
  1. pomaga zidentyfikować konflikty nazw klas: dwie klasy w różnych pakietach o tej samej nazwie. Można to zamaskować za pomocą * import.
  2. sprawia, że zależności są wyraźne, tak aby każdy, kto będzie musiał później przeczytać twój kod, wiedział, co chciałeś zaimportować, a czego nie chciałeś zaimportować.
  3. może przyspieszyć kompilację, ponieważ kompilator nie musi przeszukiwać całego pakietu, aby zidentyfikować depdencies, chociaż zwykle nie jest to wielka sprawa z nowoczesnymi Kompilatory.
  4. niewygodne aspekty wyraźnego importu są zminimalizowane dzięki nowoczesnym IDE. Większość IDE pozwala zwijać sekcję import, aby nie przeszkadzała, automatycznie wypełniać import w razie potrzeby i automatycznie identyfikować nieużywane importy, aby pomóc je wyczyścić.

Większość miejsc, w których pracowałem, które używają znaczącej ilości Javy, sprawia, że jawne importowanie jest częścią standardu kodowania. Czasami nadal używam * do szybkiego prototypowania, a następnie rozwijam listy importu (niektóre IDE zrobią to również za Ciebie) podczas produkcji kodu.

 10
Author: Josh Segall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 04:42:24

Preferuję konkretny import, ponieważ pozwala mi to zobaczyć wszystkie zewnętrzne odniesienia używane w pliku bez patrzenia na cały plik. (Tak, Wiem, że niekoniecznie będzie to wykazywać w pełni kwalifikowane referencje. Ale unikam ich, gdy tylko to możliwe.)

 8
Author: Jeff C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 03:59:11

W poprzednim projekcie stwierdziłem, że zmiana z * - import na import specyficzny skróciła czas kompilacji o połowę (z około 10 minut do około 5 minut). * - Import sprawia, że kompilator przeszukuje każdy z wymienionych pakietów pod kątem klasy pasującej do tej, której użyłeś. Chociaż ten czas może być mały, sumuje się w przypadku dużych projektów.

Poboczny wpływ * - import polegał na tym, że programiści kopiowali i wklejali popularne linie importu, zamiast myśleć o tym, czego potrzebują.

 7
Author: Michael Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-10 15:57:56

W DDD book

W dowolnej technologii rozwoju, na której będzie oparta implementacja, poszukaj sposobów na zminimalizowanie praca modułów refaktoryzacyjnych . W Javie nie ma ucieczki od importowania do poszczególnych klas, ale może co najmniej importować całe pakiety na raz, odzwierciedlając zamiar, że pakiety są wysoce spójne jednostki jednocześnie zmniejszając wysiłek zmiany nazw pakietów.

I jeśli zaśmieca lokalną przestrzeń nazw to nie twoja wina - obwiniaj Rozmiar paczki.

 6
Author: Ivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 08:54:23

Najważniejsze jest to, że importowanie java.awt.* może sprawić, że twój program będzie niezgodny z przyszłą wersją Javy:

Załóżmy, że masz klasę o nazwie "ABC", używasz JDK 8 i importujesz java.util.*. Załóżmy, że Java 9 wyjdzie i ma nową klasę w pakiecie java.util, która przez przypadek nazywana jest również "ABC". Twój program nie będzie teraz kompilowany na Javie 9, ponieważ kompilator nie wie, czy z nazwą "ABC"masz na myśli własną klasę, czy nową klasę w java.awt.

Nie będziesz miał tego problemu, gdy zaimportujesz tylko te klasy bezpośrednio z java.awt, których faktycznie używasz.

Zasoby:

Import Java

 3
Author: Aftab Virtual,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 18:50:25

Wśród wszystkich ważnych punktów po obu stronach nie znalazłem mojego głównego powodu, aby unikać wieloznaczności: lubię być w stanie odczytać kod i wiedzieć bezpośrednio, czym jest każda klasa, lub czy jej definicja nie jest w języku lub Pliku, gdzie ją znaleźć. Jeśli importuje się więcej niż jeden pakiet z*, muszę przeszukać każdy z nich, aby znaleźć klasę, której nie rozpoznaję. Czytelność jest najwyższa i zgadzam się, że kod nie powinien wymagać IDE do jego odczytu.

 1
Author: user109439,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 00:25:52
  • Nie ma wpływu na środowisko uruchomieniowe, ponieważ kompilator automatycznie zastępuje * konkretnymi nazwami klas. Jeśli dekompilujesz .plik klasy, nigdy nie zobaczysz import ...*.

  • C #zawsze używa * (w domyśle), jak tylko using Nazwa pakietu. Nigdy nie możesz podać nazwy klasy. Java wprowadza funkcję po c#. (Java jest tak trudna w wielu aspektach, ale wykracza poza ten temat).

  • W Intellij Idea kiedy robisz "organizowanie importu", to automatycznie zastępuje wiele importów tego samego pakietu *. Jest to funkcja mandantory, ponieważ nie można jej wyłączyć(choć można zwiększyć próg).

  • Przypadek wymieniony w zaakceptowanej odpowiedzi jest nieważny. Bez * nadal masz ten sam problem. Musisz podać nazwę pakcage w kodzie bez względu na to, czy używasz*, czy nie.

 1
Author: Leon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 00:36:50