Есть ли разница между импортом классов и пакетов в 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;
Помимо длины кода, есть ли какие-либо конкретные преимущества использования каждого подхода в любом случае? Выделение памяти? Спектакль?
6 ответов
Нет никакого преимущества в производительности или распределении памяти - они оба будут компилироваться в один и тот же байт-код.
import
оператор должен сказать компилятору, где найти классы, на которые ссылается исходный код.
Тем не менее, есть преимущество импорта только по классам. Если в двух пакетах есть класс с точно таким же именем, возникнет конфликт относительно того, на какой класс ссылаются.
Одним из таких примеров является java.awt.List
класс и java.util.List
учебный класс.
Допустим, мы хотим использовать java.awt.Panel
и 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.
Импорт, который вы решите использовать, имеет значение только во время компиляции при разрешении имен классов.
Таким образом, единственные преимущества / недостатки относятся к удобочитаемости.
Лучше импортировать только необходимый минимум, потому что кто-то может посмотреть на то, что вы на самом деле используете. Тем не менее, IDE, вероятно, справится с этим, и это спорный вопрос.
Выполнение явного импорта более безопасно во время компиляции, поскольку нет возможности конфликта классов. например
import java.sql.*;
import java.util.*;
вызывает проблему, если вы пытаетесь использовать класс Date (т.е. из какого пакета?).
Но кроме этого, нет никакого аспекта производительности или памяти. Это чисто проблема времени компиляции.
Преимущество импорта с использованием '*' состоит в том, что в нем меньше строк кода и меньше набирается текста. Это более важно, если вы выполняете кодирование с помощью "тупого" текстового редактора, а не IDE, поскольку можете использовать эллипсы для скрытия импорта и можете добавлять импорт полуавтоматически.
Недостатки импорта с использованием '*':
- Иногда вы получаете импортированные коллизии имен классов; например, когда какое-то имя класса используется для классов в разных пакетах, и вы импортируете оба из них.
- Вы не можете видеть класс явных зависимостей, глядя на импорт. Но это менее важно, если ваша IDE может показать вам зависимости другим способом.
Нет никакой разницы в распределении памяти или производительности для вашего приложения; операторы import вообще не влияют на время выполнения вашей программы. Это просто директивы, указывающие компилятору, где (в каких пакетах) найти классы.
Однако лучше избегать синтаксиса подстановочных знаков и всегда использовать определенный импорт. Это позволит избежать проблем с совместимостью будущих версий библиотек с вашей программой.
Предположим, вы используете версию 1.0 какой-либо библиотеки в вашей программе, и вы делаете import somelibrary.*;
, Предположим, что в вашей программе есть класс с именем X
, Теперь выходит версия 1.1 библиотеки, и вы хотите ее использовать. Предположим, что случайно появился новый класс с именем X
в версии 1.1 библиотеки.
Если вы использовали подстановочный синтаксис, вы вдруг также импортируете X
из библиотеки. Компилятор выдаст ошибку, потому что класс уже есть X
в вашей программе, и компилятор не может различить ваши X
а также X
из библиотеки.
Если вы импортируете только те классы, которые вам действительно нужны, из библиотеки, то у вас не возникнет этой проблемы, потому что вы не будете автоматически импортировать X
с версии 1.1 библиотеки.
Любая приличная IDE добавит для вас операторы импорта и многое другое. Получите лучший IDE, если это проблема для вас.
IntelliJ делает это; Затмение тоже. Я не использую NetBeans, но готов поспорить, что это так.