Импорт пакета. * Vs import package.SpecificType

Предположим ли вы, что какая-либо разница в отношении накладных расходов для записи импорта загружает все типы внутри одного пакета ( import java.* ); чем конкретный тип (например, import java.lang.ClassLoader )? Будет ли второй вариант более целесообразным, чем другой?

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

Взгляните на java API, и вы увидите много classов и интерфейсов с тем же именем в разных пакетах.

Например:

 java.lang.reflect.Array java.sql.Array 

Таким образом, если вы импортируете java.lang.reflect.* И java.sql.* вас будет столкновение с типом массива, и вы должны полностью их квалифицировать в своем коде.

Импортирование определенных classов вместо этого избавит вас от этой проблемы.

На самом деле это очень плохая проблема.

Предположим, вы пишете

 import a.*; import b.*; ... Foo f; 

и class Foo существует в пакете a.

Теперь вы проверяете свой совершенно компилируемый код, а через шесть месяцев кто-то добавляет class Foo в пакет b. (Возможно, это сторонняя библиотека, добавленная в последнюю версию classов).

Пуф! Теперь ваш код отказывается компилировать.

Никогда не используйте импорт по требованию. Это зло!

См. http://javadude.com/articles/importondemandisevil.html для получения более подробной информации.

Производительность RE:

 import a.*; 

против

 import aX; 

Не влияет на время выполнения. Компилятор исправляет разрешенные имена classов в сгенерированные файлы .class.

Вид меньшинства: в моем коде я обычно использую тонны classов из нескольких пакетов вместе с несколькими нечетными classами здесь и там. Мне нравится держать список импорта небольшим, чтобы я мог понять, что происходит с первого взгляда. Чтобы сделать это, я установил порог в 4 classа. Выше этого, Eclipse будет использовать * для моего кода. Я нахожу, что это сохраняет доступность моего пакета импорта, и я склонен ссылаться на них как на первое, что я делаю, когда смотрю на class, чтобы ответить на вопрос: с кем он разговаривает?

Что касается коллизии имен: каковы шансы, что вы импортируете четыре или более classов из двух пакетов, имеющих конкурирующие имена classов? ЕСЛИ это более чем в 10% случаев, вы можете рассмотреть количество пакетов, на которые полагается ваш class (например, реорганизовать его на более мелкие classы).

Хорошая причина никогда не использовать импорт xxx. * – иметь четкое видение зависимостей .

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

После поиска дополнительной информации я наткнулся на этот сайт, где это очень хорошо объяснено. Проблема с импортом и влияет ли использование * в выражении импорта на производительность? ,

Есть ли проблема эффективности между этими двумя стилями? Возможно, но так как импортные объявления фактически ничего не импортируют в вашу программу, любая разница очень мала. Помните, что есть неявный импорт java.lang. * В верхней части ваших единиц компиляции, а java.lang в JDK 1.2.2 содержит 75 classов и интерфейсов. Эксперимент с использованием надуманного примера, один из которых использует тысячи имен classов, которые необходимо искать, показал незначительное изменение скорости компиляции. Таким образом, производительность компиляции, вероятно, не должна считаться фактором при выборе одного формата над другим.

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

 package P; public class A { public static class B {} } 

Если вы хотите получить доступ к A из другого модуля компиляции, вы говорите:

 import P.*; 

или: импортировать ПА; Но если вы хотите получить доступ к B без квалификации, вам нужно сказать:

 import PA*; 

или: импортировать PAB; Первый из них предоставляет доступные типы в classе A, найденном в пакете P. Второй позволяет использовать только тип B, найденный в classе A в пакете P.

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

Если вы импортируете более 20 classов из одного пакета, вам лучше использовать импорт xxx. *. «Чистый код» поддерживает импорт всего пакета.

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

Я считаю, что лучше: a) Быть явным, перечисляя все импорты. B) Пусть ваша среда IDE справится с этим. Любая из основных IDE может автоматически обновлять, сортировать и завершать импорт.

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

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

Давайте будем гением компьютера.