Почему использование подстановочного знака с оператором импорта Java - это плохо?

Гораздо удобнее и чище использовать один оператор, например

import java.awt.*;

чем импортировать кучу отдельных классов

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

Что плохого в использовании подстановочного знака в заявлении import?


person jnancheta    schedule 29.09.2008    source источник


Ответы (17)


Единственная проблема в том, что он загромождает ваше локальное пространство имен. Например, предположим, что вы пишете приложение Swing и вам нужно java.awt.Event, а также вы взаимодействуете с системой календаря компании, в которой есть com.mycompany.calendar.Event. Если вы импортируете оба, используя метод подстановочных знаков, произойдет одно из трех:

  1. У вас есть явный конфликт имен между java.awt.Event и com.mycompany.calendar.Event, поэтому вы даже не можете скомпилировать.
  2. На самом деле вам удается импортировать только один (только один из двух импортируемых файлов делает .*), но он неправильный, и вам сложно понять, почему ваш код утверждает, что тип неправильный.
  3. Когда вы компилируете свой код, com.mycompany.calendar.Event нет, но когда они позже добавляют его, ваш ранее действующий код внезапно перестает компилироваться.

Преимущество явного перечисления всего импорта состоит в том, что я могу сразу определить, какой класс вы собираетесь использовать, что значительно упрощает чтение кода. Если вы делаете что-то одноразовое, в этом нет ничего явного неправильного, но в противном случае будущие сопровождающие будут благодарить вас за вашу ясность.

person Benjamin Pollack    schedule 29.09.2008
comment
Это первый сценарий, который случится. Компилятор замечает наличие двух классов событий и выдает ошибку. - person jan.vdbergh; 29.09.2008
comment
Обязательно ознакомьтесь с моим комментарием ниже - есть более серьезная проблема, связанная с добавлением типов в сторонние библиотеки с течением времени. У вас может быть компилируемый код, который перестает компилироваться после того, как кто-то добавит тип в jar-файл, от которого вы зависите. - person Scott Stanchfield; 29.09.2008
comment
Что касается вопроса 1: технически вы можете скомпилировать, но вам придется каждый раз использовать полное имя класса. - person Kip; 11.06.2009
comment
Вы можете разрешить такие конфликты, не перечисляя явно каждый класс, что само по себе вызывает проблемы. - person rpjohnst; 29.09.2011
comment
Я удивлен, что этот ответ был принят и набрал более 500 голосов. Буквально, когда компиляторы находят что-то для вас, это хорошо, а не плохо. Я до сих пор не встречал ни одного аргумента об импорте звездочек, который отвечал бы ежедневным потребностям разработчиков и не связан с авторитаризмом Checkstyle. - person mobiusinversion; 18.10.2020

Вот голосование за звездный импорт. Оператор импорта предназначен для импорта пакета, а не класса. Намного проще импортировать целые пакеты; проблемы, указанные здесь (например, java.sql.Date vs java.util.Date), легко устраняются другими способами, на самом деле не решаются конкретным импортом и, конечно же, не оправдывают безумно педантичный импорт для всех классов. Нет ничего более обескураживающего, чем открытие исходного файла и необходимость пролистать 100 операторов импорта.

Выполнение определенного импорта затрудняет рефакторинг; если вы удаляете / переименовываете класс, вам необходимо удалить все его конкретные импортированные файлы. Если вы переключите реализацию на другой класс в том же пакете, вам придется исправить импорт. Хотя эти дополнительные шаги можно автоматизировать, они действительно снижают производительность без реальной выгоды.

Если бы Eclipse не выполнял импорт определенных классов по умолчанию, все бы все равно выполняли импорт звездочек. Извините, но на самом деле нет никакого рационального оправдания для конкретного импорта.

Вот как справляться с конфликтами классов:

import java.sql.*;
import java.util.*;
import java.sql.Date;
person davetron5000    schedule 29.09.2008
comment
Я согласен. Хотя я не возражаю против использования явного импорта, я все же предпочитаю использовать импорт звездочки. Они подчеркивают, что единицей повторного использования является весь пакет, а не его отдельные типы. Другие причины, перечисленные против импорта звезд, являются слабыми, и, по моему опыту, использование импорта звезд никогда не вызывало реальных трудностей. - person Rogério; 19.07.2009
comment
См. javadude.com/articles/importondemandisevil.html, чтобы узнать, почему это зло. Основная идея: это может привести к прекращению компиляции кода, когда классы добавлены в пакеты, которые вы импортируете (например, когда List был добавлен в java.util ...) - person Scott Stanchfield; 01.05.2012
comment
Надежное управление конфигурацией и непрерывная интеграция могут тривиально решить эту проблему, и у вас нет явных имен классов, засоряющих ваш код. Я согласен, что это плохой языковой дизайн, но его очень просто обойти - person davetron5000; 02.05.2012
comment
Все упомянутые вами проблемы могут быть решены с помощью современных IDE (сокрытие импорта, рефакторинг имени класса и т. Д.). - person assylias; 05.02.2013
comment
Мне не нужно использовать IDE для чтения или записи исходного кода - код должен быть читаемым сам по себе без специальных инструментов, если только язык не является невероятно тупым. В этом случае Java отлично работает - просто используйте импорт звездочки. Нет причин не делать этого. - person davetron5000; 09.02.2013
comment
Импорт статических звезд дает прирост производительности. Удобно просто набрать assertTrue и т. Д. Моя среда IDE настроена с использованием правил стиля проверки для моей работы, которые их запрещают. Затем для добавления статического импорта требуется преобразование существующего импорта (вручную или с помощью ярлыка). В этот момент я могу либо вручную изменить импорт на звезду (необходимо изменить позже), либо повторить описанный выше процесс для всех других методов / констант / перечислений, которые я использую. Это незначительное, но реальное нарушение. Список был неудачным; Я никогда не сталкивался с этой или подобной проблемой. Спасибо за внимание. - person Donal; 23.01.2014
comment
@ davetron5000 Вам не нужно использовать IDE для чтения или записи исходного кода. Все приличные текстовые редакторы также поддерживают сворачивание. - person David Conrad; 25.07.2014
comment
Даже дядя Боб рекомендует выполнять импорт пакетов в своей книге «Чистый код». Для меня это достаточно веская причина использовать их. - person Sergei Tachenov; 24.06.2016
comment
@ davetron5000 Если ваш код содержит 10+ импортированных подстановочных знаков, и вы используете класс Foo, и если я прочитал ваш код без использования IDE (поскольку ваш аргумент состоит в том, что мне не нужно его использовать), как я узнаю, какой пакет Foo пришли из? Конечно, при использовании IDE среда IDE сообщит мне об этом, но весь ваш аргумент состоит в том, что я должен иметь возможность читать код без него. Выполнение явного импорта помогает документировать код (отличная причина избегать использования подстановочных знаков), и гораздо более вероятно, что я буду читать код без использования IDE, тогда я буду писать код без использования IDE. - person Andreas; 12.01.2017
comment
Ответ: Оператор импорта предназначен для импорта пакета, а не класса. Моя IDE: [Java] Only a type can be imported. org.springframework.stereotype resolves to a package - person Brent Bradburn; 21.03.2018
comment
Если у вас есть сотня импортов, скорее всего, ваш класс слишком велик и, вероятно, отвечает более чем за одну вещь. Проблема здесь не в импорте, а в написанном коде. Вы должны избавиться от испорченного материала, вместо того, чтобы делать его красивым, придавая ему форму цветка. ;) - person Amadán; 05.09.2018
comment
@ davetron5000 Вы опровергли свой аргумент. Чтобы код можно было читать самостоятельно, без специальных инструментов, вы должны иметь полностью квалифицированный импорт. Используя импорт с подстановочными знаками, вы не знаете, откуда берется класс, без поиска по пакетам или использования справки при наведении курсора IDE. - person Nathan Niesen; 26.07.2019
comment
Некоторое время назад я был программистом по обслуживанию. Мне часто приходилось читать код на Github или vi. Проблема со стартовым импортом в том, что очень сложно найти, откуда берется этот определенный класс. Худшим способом было выполнить поиск по всему репозиторию или выполнить команду grep, оба варианта кажутся излишними. Я хотел, чтобы люди не использовали * импорт. И теперь я не знаю, сказано ли об этом в Чистом коде. - person Ganesh Satpute; 21.12.2019
comment
@GaneshSatpute Итак, вы только что доказали, что вам не следует использовать GitHub или vi для просмотра репозиториев. Я считаю, что правило «не следует использовать специальные инструменты для чтения кода» не годится. Мы профессионалы, мы должны использовать оптимальные (если не самые лучшие) инструменты, а не наоборот. - person user3157855; 20.08.2020
comment
@ user3157855 Я точно ничего не доказал. Я до сих пор использую vi, Github, а также современные IDE. Я стараюсь быть непредубежденным, я не буду считать кого-то непрофессиональным, потому что он использует vi или Github, чтобы показать кому-то код, или быстро посмотреть на реализацию, а не клонировать репозиторий и настраивать его локально. - person Ganesh Satpute; 20.08.2020
comment
Лично я использую импорт звездочек, потому что считаю его более чистым. Практически особых проблем не возникло. - person paulj; 02.04.2021

См. Мою статью Импорт по запросу - зло

Короче говоря, самая большая проблема заключается в том, что ваш код может сломаться, когда класс добавлен в пакет, который вы импортируете. Например:

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

// ...

List list;

В Java 1.1 это было нормально; Список найден в java.awt, и конфликта нет.

Теперь предположим, что вы вернули свой отлично работающий код, а через год кто-то другой принесет его для редактирования и использует Java 1.2.

В Java 1.2 в java.util добавлен интерфейс с именем List. БУМ! Конфликт. Совершенно рабочий код больше не работает.

Это особенность языка ЗЛО. Нет НЕТ причин, по которой код должен прекратить компиляцию только потому, что тип добавлен в пакет ...

Кроме того, читателю сложно определить, какой Foo вы используете.

person Scott Stanchfield    schedule 29.09.2008
comment
Это не оправдание. Если вы меняете версию java, вы каким-то образом ожидаете, что что-то не удастся, то же самое, если вы измените версию двоичного файла, который использует ваш код. В этих случаях код выдает ошибку компиляции, и ее легко исправить (см. Предыдущий ответ: stackoverflow.com/a/149282/7595) - person Pablo Fernandez; 06.04.2012
comment
@PabloFernandez - Нет - если я проверю код, который хранился в репозитории в течение года, он все равно должен компилироваться. Импорт по запросу может легко завершиться ошибкой, когда новые классы добавлены к существующим пакетам, которые я импортировал. Это проблема не только при обновлении версий Java. Также - если API спроектирован хорошо, он не должен никогда нарушать существующий код при обновлении. Единственный раз, когда мне потребовалось изменить код при обновлении версий java, было из-за импорта по запросу и когда Sun втянула XML API в среду выполнения java. - person Scott Stanchfield; 01.05.2012
comment
Я придаю большое значение языковой функции, которая заставляет однажды компилируемый код перестать компилироваться, когда вы добавляете что-то в путь к классу. Очень большая проблема, особенно когда сопровождающий берет код, который они не писали - как они узнают намерение, не изучая код какое-то время - код, который раньше компилировался и отлично работал ... Почему они должны его менять только потому, что к пути компиляции был добавлен новый jar или обновлен JDK? - person Scott Stanchfield; 24.12.2012
comment
Путь к классам - это фундаментальный компонент процесса компиляции. Если вы думаете, что произвольное изменение пути к классам не повлияет на ваш однажды скомпилированный код, то вы, мягко говоря, наивны. - person Pablo Fernandez; 24.12.2012
comment
ДОБАВЛЕНИЕ класса (с уникальным, полностью определенным именем!) В путь к классам не должно ни на что влиять. Дело в том, что если вы do_not используете синтаксис импорта по запросу, этого не произойдет. Так что не используйте плохой синтаксис, который, к сожалению, допускает язык, и это еще одна реальная проблема, с которой вы можете столкнуться. - person Scott Stanchfield; 25.12.2012
comment
Суть моего ответа в том, что это ненужная языковая функция, которая вызывает проблемы. Многие IDE / редакторы автоматически обрабатывают расширение импорта. Используйте полностью квалифицированный импорт, и вероятность возникновения этой конкретной ошибки отсутствует. Меня поразило это, когда я был вынужден исправить ошибку в существующем коде, и вам действительно не нужно что-то подобное, чтобы отвлечься от реальной задачи. java.util.List vs java.awt.List не так уж и плохо, чтобы понять, но попробуйте это, когда имя класса Configuration и несколько библиотек зависимостей добавили его в свою последнюю версию репозитория maven. - person Scott Stanchfield; 25.12.2012
comment
Если я обновлю jar-файл, в котором классы, которые я использую, совместимы с API-forward, И я не использую синтаксис импорта по запросу, это никак не повлияет на меня. Это имеет для вас смысл? Не поленитесь определить импорт, и это не проблема. Синтаксис импорта по запросу был ошибкой в ​​определении языка Java; разумный язык не должен допускать подобных ошибок. - person Scott Stanchfield; 28.12.2012
comment
В статье Скотта он утверждает, что если бы Sun создала java.util.collections.List вместо java.util.List, не было бы конфликта с java.awt.List. Это почему? - person Sheldon R.; 21.01.2014
comment
@SheldonR., Потому что, если бы они изобрели новый пакет (java.util.collections) для List, у устаревшего кода не было бы риска импортировать его по ошибке. - person aioobe; 03.06.2015
comment
@aioobe Разве java.util.collections не подхватит java.util. *? - person Sheldon R.; 05.06.2015
comment
@aioobe Пакеты в Java - это просто уникальные имена. Они могут выглядеть как вложенные имена из-за общих префиксов, но они никогда не имеют отношения к другим пакетам. (Обратите внимание, что они имеют общие структуры родительских каталогов, но это просто удобство среды, а не определение языка ...) - person Scott Stanchfield; 05.06.2015
comment
Думаю, ваш комментарий должен был быть адресован SheldonR. - person aioobe; 05.06.2015
comment
@aioobe (я хотел, чтобы он перешел к вам, чтобы добавить некоторые пояснения относительно того, почему java.util.collections не будет получен при импорте java.util. *) - person Scott Stanchfield; 09.06.2015
comment
Хорошо, спасибо за ваш комментарий, но вам не нужно учить меня, как работают пакеты Java. :-D (Я зарабатываю на жизнь компилятором OpenJDK Java ;-) - person aioobe; 09.06.2015
comment
Обратите внимание, что конкретный импорт имеет приоритет над импортом с подстановочными знаками. import java.awt.*; import java.util.*; import java.util.List; достаточно, чтобы устранить неоднозначность List. Это намного чище, чем называть каждый класс. - person Kevin; 06.02.2016
comment
@Kevin Наличие любого импорта с подстановочными знаками подвергает вас риску того, что код не будет компилироваться при добавлении новой сторонней зависимости или обновлении до более поздней версии Java. Имея доступные IDE, вы всегда можете свернуть список импорта, чтобы не смотреть на него - person Scott Stanchfield; 10.02.2016
comment
@ScottStanchfield Обновление часто вызывает незначительные головные боли, но вероятность того, что обновление приведет к тому, что ранее однозначное имя станет неоднозначным, довольно редка, так что не стоит беспокоиться. - person Kevin; 15.02.2016
comment
И, на мой взгляд, читабельность в среде IDE недостаточно хороша. Код должен быть легко читаемым в любом текстовом редакторе, даже в тех, которые не выполняют сворачивание импорта или кода. - person Kevin; 15.02.2016
comment
@Kevin - проблема заключается между удобочитаемостью в редакторах, которые не поддерживают сворачивание (я бы сказал, что не большинство из используемых), и огромным потенциалом ошибок компилятора, вносимых изменениями библиотеки. Я видел, как этот потенциал реализовывался много раз (самый ранний и самый отвратительный - List в java.util. * И java.awt. *), Потому что разработчики используют импорт по запросу, а это чаще всего влияет на человека, обслуживающего код год или позже, что обременяет их за счет читабельности вашего слабого редактора. Не обременяйте своих сопровождающих. И получите лучший редактор. - person Scott Stanchfield; 17.02.2016
comment
Нет НИКАКОЙ причины, по которой код должен прекращать компиляцию только потому, что тип добавлен в пакет - это также может быть проблемой, когда перечисление было расширено новым типом. - person Dávid Horváth; 23.08.2016
comment
В любом случае скомпилированное приложение будет продолжать работать с новыми выпусками Java независимо от того, как вы импортировали. Сбой в процессе сборки, а не в приложении. При обновлении до новой версии Java SDK ваши инструменты сборки сообщат вам, что у вас возникла проблема. Есть много причин, по которым обновление SDK может пойти не так, и это лишь одна из них. В конечном итоге использование явного импорта может сэкономить ваше время, но использование подстановочных знаков не является злом по своей сути, если вы об этом знаете. - person Paul Cunningham; 24.07.2020
comment
Также возврат к Java 1.1 - ›Java 1.2 в качестве примера недопустим. Это было ГЛАВНОЕ изменение парадигмы, и тонна существующего кода Java сломалась во время этого перехода. - person Paul Cunningham; 24.07.2020
comment
@PaulCunningham Это классический пример (и совершенно верный) этой проблемы, который может случиться с любой версией языка Java. Проблема со временем только усугубляется с появлением все большего количества сторонних библиотек, каждая из которых может добавлять новые классы, которые могут иметь то же имя, что и класс в другой библиотеке. - person Scott Stanchfield; 14.05.2021

неплохо использовать подстановочный знак в операторе импорта Java.

В Чистом коде Роберт К. Мартин действительно рекомендует использовать их, чтобы избежать длинных списков импорта.

Вот рекомендация:

J1: избегайте длинных списков импорта с помощью подстановочных знаков

Если вы используете два или более классов из пакета, импортируйте весь пакет с помощью

импортный пакет. *;

Длинные списки импорта устрашают читателя. Мы не хотим загромождать вершины наших модулей 80 строками импорта. Скорее, мы хотим, чтобы импорт был кратким заявлением о том, с какими пакетами мы сотрудничаем.

Конкретный импорт - это жесткие зависимости, а импорт с подстановочными знаками - нет. Если вы специально импортируете класс, он должен существовать. Но если вы импортируете пакет с подстановочным знаком, никаких конкретных классов не должно быть. Оператор импорта просто добавляет пакет в путь поиска при поиске имен. Таким образом, такой импорт не создает настоящей зависимости, и поэтому они служат для того, чтобы наши модули были менее связанными.

Бывают случаи, когда может быть полезен длинный список конкретных импортов. Например, если вы имеете дело с устаревшим кодом и хотите узнать, для каких классов вам нужно создавать макеты и заглушки, вы можете пройтись по списку конкретных импортов, чтобы узнать истинные квалифицированные имена всех этих классов, а затем поставить соответствующие заглушки на место. Однако это использование для конкретного импорта очень редко. Кроме того, большинство современных IDE позволяют преобразовывать импорт с подстановочными знаками в список определенных импортов с помощью одной команды. Так что даже в устаревшем случае лучше импортировать подстановочные знаки.

Импорт подстановочных знаков может иногда вызывать конфликты имен и неоднозначность. Два класса с одинаковым именем, но в разных пакетах, необходимо будет специально импортировать или, по крайней мере, специально квалифицировать при использовании. Это может доставлять неудобства, но бывает достаточно редко, поэтому использование подстановочного импорта по-прежнему лучше, чем конкретный импорт.

person hwiechers    schedule 02.01.2010
comment
Я бы посоветовал Роберту К. Мартину использовать лучшие шаблоны для создания более сжатых пакетов и собственных классов, не требующих 80 строк импорта. То, что множество классов, необходимых для импорта внутри одного класса, просто умоляет: «Энтропия, энтропия, сломай меня, пожалуйста ...» и указывает причину, по которой следует избегать импорта *, изложенную в ответах Скотта Стэнчфилдса. - person Ray; 24.11.2014
comment
Хотя мне вообще нравится то, что говорит дядя Боб, в этом случае я также вынужден с ним не согласиться. - person ; 31.07.2015
comment
Длинные списки импорта пугают читателя. - Это утверждение неверно. Программистам не требуется читать исходный код сверху вниз. Мы можем вообще не читать списки импорта. Когда мы это сделаем, мы можем прочитать только один из импортов для пояснения. В других случаях импорт может быть полностью свернут, если мы работаем в среде IDE. Независимо от источника, сегодня это плохой совет. - person Andy Thomas; 28.04.2016
comment
Просто чтобы обеспечить некоторый противовес при цитировании авторитетов по этому вопросу: Руководство по стилю Google Java, а также Руководство по стилю Java в Twitter (которое, честно говоря, в значительной степени основано на руководстве Google) специально запрещает импорт подстановочных знаков. Но они не дают никаких оснований для этого решения. - person anothernode; 06.09.2017
comment
Наверное, единственное, с чем я не согласен в Clean Code. Ему приходится прокручивать несколько строк операторов импорта или изо всех сил пытаться найти, откуда взялся класс. Я предпочитаю легко определять происхождение определенного класса. - person Ganesh Satpute; 21.12.2019

Производительность: не влияет на производительность, так как байт-код такой же. хотя это приведет к некоторым накладным расходам на компиляцию.

Компиляция: на моей персональной машине компиляция пустого класса без импорта чего-либо занимает 100 мс, но тот же класс при импорте java. * занимает 170 мс.

person Vinish Nain    schedule 06.05.2014
comment
import java.* ничего не импортирует. Какая разница? - person user207421; 09.11.2015
comment
Это имеет значение, потому что он ищется во время компиляции. - person LegendLength; 07.01.2016
comment
Я чувствую, что это сравнение не согласуется с вопросом, потому что оно ничего не сравнивает с импортом с подстановочными знаками. Мне было бы любопытно, какова разница во времени компиляции при импорте класса через подстановочный знак по сравнению с конкретным. А поскольку компилятор ищет в пакете подстановочный знак, я предполагаю, что разница во времени зависит от размера пакета и количества импортированных классов из того же пакета. - person kugo2006; 29.07.2020

Он загромождает ваше пространство имен, требуя от вас полного указания любых неоднозначных имен классов. Чаще всего это происходит с:

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

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

Это также помогает сделать ваши зависимости конкретными, поскольку все ваши зависимости перечислены в верхней части файла.

person hazzen    schedule 29.09.2008

  1. Это помогает выявить конфликты имен классов: два класса в разных пакетах с одинаковыми именами. Это можно замаскировать с помощью * import.
  2. Он делает зависимости явными, так что любой, кому позже придется прочитать ваш код, знает, что вы хотели импортировать, а что не хотели импортировать.
  3. Это может ускорить некоторую компиляцию, потому что компилятору не нужно искать по всему пакету, чтобы определить зависимости, хотя обычно это не имеет большого значения для современных компиляторов.
  4. Неудобные аспекты явного импорта сводятся к минимуму с помощью современных IDE. Большинство IDE позволяют свернуть раздел импорта, чтобы он не мешал, автоматически заполнять импорт при необходимости и автоматически определять неиспользуемые импорты, чтобы помочь очистить их.

В большинстве мест, где я работал, где используется значительное количество Java, явный импорт является частью стандарта кодирования. Иногда я все еще использую * для быстрого прототипирования, а затем расширяю списки импорта (некоторые IDE также сделают это за вас) при создании кода.

person Josh Segall    schedule 29.09.2008
comment
Мне нравится большинство ваших пунктов, но именно №4 заставило меня проголосовать за ваш ответ. Современные IDE удаляют большинство аргументов против использования явного импорта ... - person Sheldon R.; 21.01.2014
comment
Возможно, часть проблемы здесь заключается в том, как стандартные библиотеки Java размещаются со многими классами в одном пакете. В отличие от применения «принципа единой ответственности» к пакету. - person LegendLength; 07.01.2016

Я предпочитаю определенный импорт, потому что он позволяет мне видеть все внешние ссылки, используемые в файле, не просматривая файл целиком. (Да, я знаю, что здесь не обязательно будут отображаться полностью квалифицированные ссылки. Но я по возможности избегаю их.)

person Jeff C    schedule 29.09.2008

В предыдущем проекте я обнаружил, что переход от * -imports к конкретному импорту сокращает время компиляции вдвое (с примерно 10 минут до примерно 5 минут). * -Import заставляет компилятор искать в каждом из перечисленных пакетов класс, соответствующий тому, который вы использовали. Хотя это время может быть маленьким, оно подходит для крупных проектов.

Побочным эффектом * -import было то, что разработчики копировали и вставляли общие строки импорта, а не думали о том, что им нужно.

person Michael Hall    schedule 10.10.2008
comment
Должно быть много строк импорта или действительно жалкая система разработки, чтобы это было правдой. Я использую import- * и могу скомпилировать мою всю кодовую базу из 2107 классов менее чем за 2 минуты. - person Lawrence Dol; 06.03.2010

В книге DDD

В какой бы технологии разработки ни была основана реализация, ищите способы минимизировать работу по рефакторингу МОДУЛЕЙ. В Java нет выхода из импорта в отдельные классы, но вы можете импортировать по крайней мере целые пакеты за раз, что отражает намерение, что пакеты являются очень связными единицами, одновременно сокращая усилия по изменению имен пакетов.

И если он загромождает локальное пространство имен, это не ваша вина - виноват размер пакета.

person Ivan    schedule 17.06.2016

  • Это не влияет на время выполнения, поскольку компилятор автоматически заменяет * конкретными именами классов. Если вы декомпилируете файл .class, вы никогда не увидите import ...*.

  • C # всегда использует * (неявно), поскольку вы можете только using имя пакета. Вы вообще никогда не можете указывать имя класса. В Java эта функция появилась после C #. (Java очень сложна во многих аспектах, но это выходит за рамки этой темы).

  • В Intellij Idea, когда вы «организуете импорт», он автоматически заменяет несколько импортированных одного и того же пакета на *. Это обязательная функция, так как вы не можете отключить ее (хотя вы можете увеличить порог).

  • Случай, указанный в принятом ответе, недействителен. Без * у вас все еще та же проблема. Вы должны указать имя pakcage в своем коде, независимо от того, используете вы * или нет.

person Leon    schedule 18.03.2018
comment
В IntelliJ это не обязательная функция, и ее можно отключить. - person Bastien7; 18.10.2019
comment
В Java был импорт подстановочных знаков, начиная с JDK 1.0.2, он не представил эту функцию после C #. Именно C # скопировал большую часть Java. В любом случае, чем Java сложна? - person ehecatl; 25.05.2021

Самая важная из них заключается в том, что импорт java.awt.* может сделать вашу программу несовместимой с будущей версией Java:

Предположим, у вас есть класс с именем «ABC», вы используете JDK 8 и импортируете java.util.*. Теперь предположим, что выходит Java 9, и у нее есть новый класс в пакете java.util, который по совпадению также называется «ABC». Теперь ваша программа не будет компилироваться на Java 9, потому что компилятор не знает, имеете ли вы под именем «ABC» свой собственный класс или новый класс в java.awt.

У вас не будет этой проблемы, если вы явно импортируете из java.awt только те классы, которые вы действительно используете.

Ресурсы:

Импорт Java

person Afee    schedule 20.09.2016
comment
совет: вы могли бы использовать Stream в качестве примера нового класса, добавленного в Java в java.util в Java 8 ... - person Clint Eastwood; 24.07.2017

Среди всех допустимых моментов, высказанных с обеих сторон, я не нашел своей основной причины избегать подстановочного знака: мне нравится иметь возможность читать код и напрямую знать, что такое каждый класс, или если его определение не на языке или файл, где его найти. Если с * импортировано более одного пакета, мне нужно поискать каждый из них, чтобы найти класс, который я не узнаю. Удобочитаемость на высшем уровне, и я согласен, что код не должен требовать IDE для его чтения.

person user109439    schedule 21.12.2017
comment
Если вы доведете это до его полного логического завершения, тогда ваш стиль должен заключаться в том, чтобы вообще не использовать импорт, а вместо нового LinkedList всегда использовать новый java.util.LinkedList и делать это последовательно везде. - person Erwin Smout; 28.09.2018

Для записи: добавляя импорт, вы также указываете свои зависимости.

Вы могли быстро увидеть, каковы зависимости файлов (за исключением классов одного и того же пространства имен).

person magallanes    schedule 07.02.2019
comment
Согласен. Мотиватор не столько в производительности или компиляции, сколько в удобочитаемости вашего кода. Представьте, что вы читаете код без IDE - например, на GitHub. Внезапно поиск каждой ссылки, не определенной в файле, который вы читаете, становится утомительно утомительно. - person Leo Orientis; 27.10.2019

Вот несколько вещей, которые я нашел по этой теме.

  • Во время компиляции компилятор пытается найти классы, которые используются в коде из. * Import, и соответствующий байт-код будет сгенерирован путем выбора используемых классов из. * Import. Таким образом, байтовый код использования. * Import или .class names import будет таким же, и производительность во время выполнения также будет такой же из-за того же байтового кода.

  • В каждой компиляции компилятор должен сканировать все классы пакета. * На соответствие классам, которые фактически используются в коде. Таким образом, код с. * Import занимает больше времени в процессе компиляции по сравнению с использованием импорта имени .class.

  • Использование. * Import помогает сделать код более чистым

  • Использование. * Import может создать двусмысленность, когда мы используем два класса с одинаковым именем из двух разных пакетов. Например, Дата доступна в обоих пакетах.

      import java.util.*;
      import java.sql.*;
    
      public class DateDemo {
          private Date utilDate;
          private Date sqlDate;
      }
    
person Milan Paudyal    schedule 11.10.2020

Забудьте о загроможденных пространствах имен ... И подумайте о бедняге, который должен читать и понимать ваш код на GitHub, в vi, Notepad ++ или другом текстовом редакторе, не относящемся к IDE.

Этот человек должен тщательно искать каждый токен, который исходит от одного из подстановочных знаков, по всем классам и ссылкам в каждой области с подстановочными знаками ... просто чтобы понять, что, черт возьми, происходит.

Если вы пишете код только для компилятора - и знаете, что делаете - я уверен, что с подстановочными знаками проблем нет.

Но если другие люди - включая вас будущего - хотят быстро разобраться в конкретном файле кода за одно чтение, тогда явные ссылки очень помогают.

person Leo Orientis    schedule 03.10.2020

Импорт всех классов в пакете считается слепым подходом. Основная причина этого в том, что это загромождает пространство имен классов и может привести к конфликтам между классами в разных пакетах с одинаковыми именами.

Специальное заполнение необходимых классов позволяет избежать этой проблемы и ясно показывает, какие версии нужны. Это хорошо для удобства сопровождения кода.

person Testilla    schedule 26.07.2020