Есть ли разница между импортом классов и пакетов в 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, но готов поспорить, что это так.

Другие вопросы по тегам