Любая причина для очистки неиспользуемых импортов на Java, кроме сокращения беспорядка?

Есть ли веская причина избежать неиспользуемых операторов импорта в Java? Насколько я понимаю, они есть для компилятора, поэтому много неиспользуемых импортов не будет иметь никакого влияния на скомпилированный код. Это просто уменьшить беспорядок и избежать конфликтов имен по линии?

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

Ответ 1

Я не думаю, что проблемы с производительностью или что-то в этом роде вероятны, если вы не удаляете импорт.

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

В Eclipse вы можете всегда использовать ярлык (в зависимости от ОС - Win: Ctrl + SHIFT + O и Mac: COMMAND + SHIFT + O) для организации импорта. Eclipse затем очищает секцию импорта, удаляет все устаревшие импорт и т.д. Если вам понадобится импортированная вещь, снова eclipse добавит их автоматически, пока вы завершаете инструкцию с помощью Ctrl + SPACE. Поэтому нет необходимости хранить неиспользуемый код в вашем классе.

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

Ответ 2

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

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

Добавление: Сегодня сервер сборки начал сбой компиляции (даже не протестировать) с ошибкой вне памяти. Он работал отлично навсегда, и чек-записи не имели никаких изменений в процессе сборки или значительных дополнений, которые могли бы объяснить это. После попытки увеличить настройки памяти (это работает 64-разрядная JVM на 64-битном CentOS!), Чтобы что-то значительно дальше, чем клиенты могли скомпилировать, я поочередно изучал проверки.

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

Ответ 3

С точки зрения пуриста любая зависимость является "ограничением" на продукте и может, таким образом, вызвать проблемы обслуживания позже.

Например, допустим, что ваша программа использует класс com.X.Y.Z.ObjectPool, а позже вы решите не использовать его, но никогда не удалять импорт. Если кто-то еще хочет создать экземпляр org.W.V.Y.ObjectPool и просто обратиться к ObjectPool, они не получают никакого предупреждения об этом, пока где-то там не появится проблема кастинга или проблемы с вызовом.

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

В любом случае вы можете попросить Eclipse очистить их для вас.

Ответ 4

Предупреждение? Попросите Eclipse автоматически их очистить. Это то, что делает IntelliJ. Если он достаточно умен, чтобы предупредить вас, он должен быть достаточно умен, чтобы очистить их. Я бы рекомендовал искать настройку Eclipse, чтобы сказать ей, чтобы она перестала быть такой кляпом и что-то делать.

Ответ 5

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

Если вам нужно было поддерживать программу, вы найдете, насколько полезно иметь один импорт класса в строке.

Подумайте о следующем сценарии:

import company.billing.*;
import company.humanrerources.*;

// other imports 


class SomeClass {
      // hundreds or thousands of lines here... 
    public void veryImportantMethod() {
      Customer customer;
      Employee comployee;
      Department dept. 
      // do something with them
     }
 }

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

Даже при использовании IDE вы не хотите наводить или переходить к декларации и возврату, проще, если вы понимаете с точки зрения функциональности, от каких других пакетов и классов зависит текущий код.

Если это для личного проекта или что-то маленькое, это действительно не имеет значения, но для чего-то большего, которое должно использоваться другими разработчиками (и поддерживаться на протяжении многих лет), это ДОЛЖНО ИМЕТЬ.

Абсолютно никакой разницы в производительности с любым.

Ответ 6

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

Автоматическое удаление импорта во время операции сохранения вызвало у меня некоторое горе, когда, например, во время разработки или тестирования у вас возникла проблема и прокомментировал какой-то код, при его сохранении импорт, используемый в разделе кода с комментариями, удаляется. Иногда это не проблема, так как вы можете отменить (Ctrl + Z) изменения, но в других случаях это не так просто, как вы могли бы внести другие изменения. У меня также была проблема, когда я раскоментировал код (ранее я закомментировал его, а затем сохранил его, тем самым удалив импорт для этого кода), он автоматически попытался угадать требуемые им импорт и подобрать неправильные (например, я думаю, что я был использован StringUtils класс, и он выбрал другой с тем же именем из неправильной библиотеки).

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

Ответ 7

Для eclipse я использую это: window → preferences → java → editor → save action → установите флажок для упорядочивания импорта (там также много другого полезного материала, например форматирование, создание полей final и скоро..). Поэтому, когда я сохраняю файл, eclipse удаляет импорт unessacry для меня. На мой взгляд, если вам что-то не нужно, удалите его (или пусть он будет удален затмением).

Ответ 8

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

Ответ 9

Нет никакого влияния на производительность, хотя для удобства чтения вы можете сделать его чистым. Удаление неиспользуемого импорта довольно просто и в Eclipse, и в IntelliJ IDEA.

Eclipse,

Windows/Linux - Ctrl + Shift + O

Mac -                             T33 > + Shift + O

IntelliJ IDEA или Android Studio

Windows/Linux - Ctrl + Alt + O

Mac -                             T33 > + Alt + O

Ответ 10

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

И, кстати, с помощью eclipse вы можете использовать Ctrl + Shift + O для организации импорта, но вы также можете настроить "очиститель", который имеет дело с такими вещами (и многими другими) каждый раз, когда вы сохранить java файл.

Ответ 11

Для меня один неиспользуемый импорт класса в классе контроллера создал проблему компиляции в сборке Jenkins после того, как я удалил импортированный класс во время очистки кода и совершил удаление в git без проверки сборки в локальном.