Единственная проблема в том, что он загромождает ваше локальное пространство имен. Например, предположим, что вы пишете приложение на Swing, и вам нужно java.awt.Event
, а также взаимодействует с системой календаря компании, которая имеет com.mycompany.calendar.Event
. Если вы импортируете оба метода подстановки, происходит одно из следующих трех событий:
- У вас прямой конфликт имен между
java.awt.Event
и com.mycompany.calendar.Event
, поэтому вы даже не можете скомпилировать.
- На самом деле вам удается импортировать только один (это делает только один из двух ваших импортов
.*
), но это неправильный вариант, и вы изо всех сил пытаетесь выяснить, почему ваш код утверждает, что тип неправильный.
- Когда вы компилируете свой код, его нет
com.mycompany.calendar.Event
, но когда он позже добавляется, ваш ранее действительный код внезапно прекращает компиляцию.
Преимущество явного перечисления всех импортов состоит в том, что я могу сразу определить, какой класс вы намеревались использовать, что просто делает чтение кода намного проще. Если вы просто делаете быструю разовую вещь, в этом нет ничего явно неправильного , но будущие сопровождающие будут благодарить вас за вашу ясность в противном случае.
Бенджамин Поллак
источник
Вот голос за звездный импорт. Оператор импорта предназначен для импорта пакета , а не класса. Гораздо чище импортировать целые пакеты; выявленные здесь проблемы (например,
java.sql.Date
vsjava.util.Date
) легко устраняются другими средствами, которые на самом деле не решаются с помощью конкретного импорта и, конечно, не оправдывают безумно педантичный импорт для всех классов. Нет ничего более смущающего, чем открытие исходного файла и необходимость пролистать 100 операторов импорта.Выполнение определенного импорта затрудняет рефакторинг; если вы удаляете / переименовываете класс, вам нужно удалить все его специфические импорта. Если вы переключаете реализацию на другой класс в том же пакете, вы должны исправить импорт. Несмотря на то, что эти дополнительные шаги могут быть автоматизированы, они действительно являются хитами производительности без реальной выгоды.
Даже если Eclipse не выполняет импорт классов по умолчанию, все равно будут выполнять импорт звездочек. Извините, но на самом деле нет рационального обоснования для выполнения конкретного импорта.
Вот как бороться с конфликтами классов:
источник
Foo
, и если я прочитал ваш код без использования IDE (поскольку вы утверждаете, что мне не нужно его использовать), как я узнаю, из какого пакетаFoo
пришел ? Конечно, используя IDE, IDE скажет мне, но весь ваш аргумент в том, что я смогу прочитать код без такового. Выполнение явного импорта помогает документировать код (хорошая причина избегать подстановочных знаков) , и гораздо более вероятно, что я буду читать код без использования IDE, чем то, что я буду писать код без использования IDE.пожалуйста, смотрите мою статью « Импорт по требованию - зло»
Короче говоря, самая большая проблема в том , что ваш код может сломаться , когда класс добавляется к пакету импортируемого. Например:
В Java 1.1 это было нормально; Список был найден в java.awt и не было никакого конфликта.
Теперь предположим, что вы зарегистрировали свой отлично работающий код, а год спустя кто-то другой выдает его для редактирования и использует Java 1.2.
Java 1.2 добавила интерфейс с именем List в java.util. БУМ! Конфликт. Отлично работающий код больше не работает.
Это особенность злого языка. Там нет НИКАКОЙ причины того, что код должен прекратить сбор только потому тип добавляется в пакет ...
Кроме того, читателю трудно определить, какой «Foo» вы используете.
источник
java.util.List
vsjava.awt.List
не так уж плохо понять, но попробуйте, когда имя классаConfiguration
и несколько библиотек зависимостей добавили его в свою последнюю версию репозитория Maven.Это не плохо , чтобы использовать джокер с оператором импорта Java.
В чистом коде Роберт С. Мартин фактически рекомендует использовать их, чтобы избежать длинных списков импорта.
Вот рекомендация:
источник
Производительность : не влияет на производительность, так как байт-код одинаков. хотя это приведет к некоторым издержкам компиляции.
Компиляция : на моем персональном компьютере компиляция пустого класса без импорта чего-либо занимает 100 мс, но тот же класс при импорте java. * Занимает 170 мс.
источник
import java.*
ничего не импортирует. Почему это имеет значение?Это загромождает ваше пространство имен, требуя от вас полного указания любых двусмысленных имен классов. Наиболее распространенным случаем этого является:
Это также помогает конкретизировать ваши зависимости, так как все ваши зависимости перечислены вверху файла.
источник
В большинстве мест, где я работал, где используется сколько-нибудь значительное количество Java, явный импорт является частью стандарта кодирования. Иногда я все еще использую * для быстрого создания прототипов, а затем расширяю списки импорта (некоторые IDE будут делать это и для вас) при создании кода.
источник
Я предпочитаю определенный импорт, потому что он позволяет мне видеть все внешние ссылки, используемые в файле, не просматривая весь файл. (Да, я знаю, что это не обязательно покажет полностью квалифицированные ссылки. Но я избегаю их, когда это возможно.)
источник
В предыдущем проекте я обнаружил, что переход от * -импортов к конкретным импортам сокращает время компиляции вдвое (с примерно 10 минут до примерно 5 минут). * -Import заставляет компилятор искать в каждом из перечисленных пакетов класс, соответствующий тому, который вы использовали. Хотя это время может быть небольшим, оно складывается для больших проектов.
Побочным эффектом * -import было то, что разработчики будут копировать и вставлять общие строки импорта, а не думать о том, что им нужно.
источник
В DDD книге
И если он загромождает локальное пространство имен, это не ваша вина - виноват размер пакета.
источник
Влияния во время выполнения не происходит, так как компилятор автоматически заменяет * конкретными именами классов. Если вы декомпилируете файл .class, вы никогда не увидите
import ...*
.C # всегда использует * (неявно), так как вы можете только
using
имя пакета. Вы никогда не можете указать имя класса вообще. Java вводит эту функцию после c #. (Java очень сложен во многих аспектах, но это выходит за рамки этой темы).В Intellij Idea, когда вы «организуете импорт», он автоматически заменяет несколько импортов одного пакета на *. Это обязательная функция, так как вы не можете отключить ее (хотя вы можете увеличить порог).
Случай, указанный в принятом ответе, недействителен. Без * у вас все еще та же проблема. Вам необходимо указать имя pakcage в вашем коде независимо от того, используете вы * или нет.
источник
Для записи: когда вы добавляете импорт, вы также указываете свои зависимости.
Вы могли быстро увидеть, каковы зависимости файлов (исключая классы одного и того же пространства имен).
источник
Наиболее важным является то, что импорт
java.awt.*
может сделать вашу программу несовместимой с будущей версией Java:Предположим, что у вас есть класс с именем «ABC», вы используете JDK 8 и импортируете
java.util.*
. Теперь предположим, что выходит Java 9, и у нее есть новый класс в пакете,java.util
который по совпадению также называется «ABC». Ваша программа теперь не будет компилироваться на Java 9, потому что компилятор не знает, подразумеваете ли вы с именем «ABC» свой собственный класс или новый класс вjava.awt
.У вас не будет этой проблемы, если вы импортируете только те классы, которые явно
java.awt
используются.Ресурсы:
Импорт Java
источник
Stream
в качестве примера новый класс, добавленный в Java в java.util в Java 8 ...Среди всех правильных замечаний, высказанных с обеих сторон, я не нашел своей основной причины избегать подстановочного знака: мне нравится иметь возможность читать код и непосредственно знать, что представляет собой каждый класс, или его определение не на языке или файл, где его найти. Если импортировано более одного пакета с *, мне нужно поискать каждый из них, чтобы найти класс, который я не узнаю. Читаемость является высшей, и я согласен, что код не должен требовать IDE для его чтения.
источник