Любая разница между импортом классов и импортом пакетов в Java?
В Java мы можем либо импортировать как отдельные классы, так и весь набор классов (пакет).
В качестве примера
import java.util.*
включает в себя
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Iterator;
import java.util.Map;
Помимо длины кода, существуют ли какие-либо конкретные преимущества использования каждого подхода каким-либо образом? Выделение памяти? Представление?
Ответы
Ответ 1
Преимущество распределения производительности или распределения памяти не существует - оба они будут скомпилированы для одного и того же байт-кода.
Оператор import
должен сообщить компилятору, где найти классы, на которые ссылается исходный код.
Однако есть преимущество для импорта только по классам. Если в двух пакетах есть класс с одним и тем же именем, возникает конфликт в отношении того, к какому классу относится.
Одним из таких примеров является класс java.awt.List
и класс java.util.List
.
Скажем, что мы хотим использовать java.awt.Panel
и a java.util.List
. Если источник импортирует пакеты следующим образом:
import java.awt.*;
import java.util.*;
Тогда обращение к классу List
будет неоднозначным:
List list; // Which "List" is this from? java.util? java.awt?
Однако, если вы импортируете явно, тогда результат будет:
import java.awt.Panel;
import java.util.List;
List list; // No ambiguity here -- it refers to java.util.List.
Ответ 2
Импорт, который вы решите использовать, делает только разницу во времени компиляции при разрешении имен классов.
Таким образом, единственные преимущества/недостатки применимы к читабельности.
Только импорт минимального требуемого вам лучше, потому что кто-то может посмотреть, что вы на самом деле используете. Тем не менее, IDE, вероятно, справляется с этим, и это спорный вопрос.
Ответ 3
Нет никакой разницы в распределении памяти или производительности для вашего приложения; Операции импорта вообще не влияют на время выполнения программы. Это просто директивы, чтобы сообщить компилятору, где (в каких пакетах) найти классы.
Однако лучше избегать синтаксиса подстановочных знаков и всегда использовать определенные импорт. Это позволит избежать проблем с совместимостью с будущими версиями библиотек с вашей программой.
Предположим, что вы используете версию 1.0 некоторой библиотеки в своей программе, и вы выполняете import somelibrary.*;
. Предположим, что ваша программа имеет класс с именем X
. Теперь выходит версия 1.1 библиотеки, и вы хотите ее использовать. Предположим, что в версии 1.1 библиотеки появился новый класс с именем X
.
Если вы использовали синтаксис подстановочных знаков, вы также внезапно импортируете X
из библиотеки. Затем компилятор выдаст вам ошибку, потому что в вашей программе уже есть класс X
, и компилятор не может отличить ваши X
и X
от библиотеки.
Если вы импортируете только те классы, которые вам действительно нужны из библиотеки, то вы не получите эту проблему, потому что вы не будете автоматически импортировать X
из версии 1.1 библиотеки.
Ответ 4
Выполнение явного импорта более безопасно во время компиляции, так как нет возможности конфликта классов. например.
import java.sql.*;
import java.util.*;
вызывает проблему, если вы пытаетесь использовать класс Date (т.е. из какого пакета?).
Но кроме этого нет аспект производительности или памяти. Это чисто проблема времени компиляции.
Ответ 5
Преимущество импорта с использованием "*" заключается в том, что он меньше строк кода и меньше печатает. Это более важно, если вы делаете свое кодирование с помощью "немого" текстового редактора, а не из среды IDE, чем можете использовать эллипсы для скрытия импорта и можете добавлять импорт полуавтоматически.
Недостатками импорта с использованием '*' являются:
- Иногда вы импортируете конфликты имени класса; например когда какое-либо имя класса используется для классов в разных пакетах, и вы импортируете их оба.
- Вы не можете видеть явные зависимости классов, просматривая импорт. Но это менее важно, если ваша среда IDE может показать вам зависимости каким-то другим способом.
Ответ 6
Любая достойная IDE поместит в ваши инструкции для импорта и многое другое. Получите лучшую IDE, если это проблема для вас.
IntelliJ делает это; так же как и Eclipse. Я сам не использую NetBeans, но я бы поспорил, что это так.