Любая разница между импортом классов и импортом пакетов в 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, но я бы поспорил, что это так.