Можно ли предположить, что какая-либо разница в отношении накладных расходов для записи импорта загружает все типы внутри одного пакета (import java.*
); чем конкретный тип (т.е. import java.lang.ClassLoader
)? Будет ли второй вариант более целесообразным, чем другой?
Импорт пакета. * Vs import package.SpecificType
Ответ 1
Для импорта не требуется производительность или накладные расходы. * vs импорт определенных типов. Тем не менее, я считаю, что наилучшей практикой никогда не использовать импорт. * Моя основная причина в том, что я просто хочу держать вещи прямолинейными, чистыми и с минимальной двусмысленностью, насколько это возможно, и я думаю, что с импортом вы теряете.
Ответ 2
Взгляните на java API, и вы увидите много классов и интерфейсов с тем же именем в разных пакетах.
Например:
java.lang.reflect.Array
java.sql.Array
Итак, если вы импортируете java.lang.reflect.*
и java.sql.*
, у вас будет столкновение с типом массива, и вы должны полностью определить их в своем коде.
Импортирование определенных классов вместо этого избавит вас от этой проблемы.
Ответ 3
На самом деле это очень плохая проблема.
Предположим, вы пишете
import a.*;
import b.*;
...
Foo f;
и класс Foo существует в пакете a.
Теперь вы проверяете свой отлично компилируемый код, а через шесть месяцев кто-то добавляет класс Foo в пакет b. (Возможно, это сторонняя библиотека, добавляющая классы в последней версии).
Пуф! Теперь ваш код отказывается компилировать.
Никогда использовать импорт по требованию. Это зло!
Подробнее см. http://javadude.com/articles/importondemandisevil.html.
Производительность RE:
import a.*;
против
import a.X;
Не влияет на время выполнения. Компилятор исправляет разрешенные имена классов в сгенерированные файлы .class.
Ответ 4
Вид меньшинства: в моем коде. Я стараюсь использовать тонны классов из нескольких пакетов вместе с несколькими нечетными классами здесь и там. Мне нравится держать список импорта небольшим, чтобы я мог понять, что происходит с первого взгляда. Чтобы сделать это, я установил порог в 4 класса. Выше этого, Eclipse будет использовать * для моего кода. Я нахожу, что это позволяет импортировать мой пакет, и я склонен ссылаться на них как на первое, что я делаю, когда я смотрю на класс, чтобы ответить на вопрос: с кем он разговаривает?
Что касается конфликтов имен: Каковы шансы, что вы импортируете четыре или более классов из двух пакетов, имеющих конкурирующие имена классов? ЕСЛИ это более 10% времени, вы можете рассмотреть количество пакетов, на которые полагается ваш класс (например, реорганизовать его на более мелкие классы).
Ответ 5
Хорошая причина никогда не использовать импорт xxx. * - иметь четкое видение зависимостей .
Вы можете быстрее узнать, что используете определенный класс другого пакета, потому что он указан в начале исходного файла.
Ответ 6
После поиска дополнительной информации я наткнулся на этот сайт, где это очень хорошо объяснено. Проблема импорта и Использует ли использование * в операторе импорта производительность?.
Есть ли проблема эффективности между этими двумя стилями? Возможно, но так как импортные объявления фактически ничего не импортируют в вашу программу, любая разница очень мала. Помните, что там неявный импорт java.lang. * В верхней части ваших блоков компиляции, а java.lang в JDK 1.2.2 содержит 75 классов и интерфейсов. Эксперимент с использованием надуманного примера, один из которых использует тысячи имен классов, которые необходимо искать, показал незначительное изменение скорости компиляции. Таким образом, производительность компиляции, вероятно, не следует рассматривать как фактор при выборе одного формата над другим.
Есть один окончательный угол интереса к объявлениям импорта. Предположим, вы используете внутренний класс:
package P;
public class A {
public static class B {}
}
Если вы хотите получить доступ к A из другого модуля компиляции, вы скажете:
import P.*;
или: импортировать P.A; Но если вы хотите получить доступ к B без квалификации, вам нужно сказать:
import P.A.*;
или: импортировать P.A.B; Первый из них предоставляет доступные типы в классе A, найденном в пакете P. Второй позволяет получить только тип B, найденный в классе A в пакете P.
Ответ 7
Я использую все, что было по умолчанию IDE. Я считаю, что это не стоит особо беспокоиться, так как оно не влияет на производительность, и проверка зависимостей может обрабатываться с помощью различных инструментов.
Ответ 8
Импорт не имеет значения на уровне байт-кода, поэтому не должно быть разницы во времени выполнения.
Я считаю, что лучше всего: a) Будьте ясны, указав весь импорт b) Пусть ваша среда IDE справится с этим. Любая из основных IDE может автоматически обновлять, сортировать и завершать импорт.
Я нашел a) пригодится пару раз при ручной переупаковке вне контекста рефакторинга в IDE. Например, когда маркетинг изменяет имя вашего продукта и решает, что все ваши пакеты должны сменить имя.
Ответ 9
Если вы импортируете более 20 классов из одного пакета, вам лучше использовать импорт xxx. *. "Чистый код" поддерживает импорт всего пакета.
Ответ 10
Это более хорошая практика кодирования, так как любой, кто читает ваш код, сразу узнает, какие классы используются конкретным классом, просто глядя на блок импорта в верхней части файла, тогда как нужно будет копать, чтобы узнать, используемые подстановочные знаки.