2009-10-12 3 views
15

В 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; 

Другие, чем длина кода, являются ли какие-либо конкретные преимущества использования каждого подхода каким-либо образом? Выделение памяти? Представление?

+0

Я как раз собирался спросить об этом. благодаря! –

ответ

26

Преимущество выбора производительности или распределения памяти - либо они будут скомпилированы для одного и того же байт-кода.

Оператор import должен сообщить компилятору, где найти классы, на которые ссылается исходный код.

Однако есть преимущество импорта только по классам. Если в двух пакетах есть класс с одним и тем же именем, возникает конфликт, к которому относится данный класс.

Одним из таких примеров является класс java.awt.List и класс java.util.List.

Предположим, что мы хотим использовать java.awt.Panel и java.util.List.Если источник импортирует пакеты следующим образом:

import java.awt.*; 
import java.util.*; 

Затем, обращаясь к List класса будет ambigious:

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. 
+1

Хорошая точка. Затем компилятор сообщает об ошибке компиляции при компиляции кода со списком? –

+0

Да, компилятор сообщит вам с ошибкой, что имя 'List' неоднозначно. – Jesper

+1

N.B. Вы можете импортировать весь пакет, а затем переопределить импорт отдельных классов. Другими словами, вы все равно можете импортировать java.awt. * Затем импортировать java.util.List. –

2

Нет никакой разницы в распределении или производительности памяти для вашего приложения; Операции импорта вообще не влияют на время выполнения программы. Это просто директивы, чтобы сообщить компилятору, где (в каких пакетах) найти классы.

Однако лучше избегать синтаксиса подстановочных знаков и всегда использовать определенные импорт. Это позволит избежать проблем с совместимостью с будущими версиями библиотек с вашей программой.

Предположим, вы используете версию 1.0 какой-либо библиотеки в своей программе, и вы делаете import somelibrary.*;. Предположим, ваша программа имеет класс с именем X. Теперь выходит версия 1.1 библиотеки, и вы хотите ее использовать. Предположим, что в версии 1.1 библиотеки появился новый класс с именем X.

Если вы использовали синтаксис подстановочных знаков, вы также импортируете X из библиотеки. Затем компилятор выдаст вам ошибку, потому что в вашей программе уже есть класс X, и компилятор не может отличить ваши X и X от библиотеки.

Если вы импортируете только те классы, которые вам действительно нужны из библиотеки, то вы не получите эту проблему, потому что вы не будете автоматически импортировать X из версии 1.1 библиотеки.

6

Импорт, который вы решите использовать, только при изменении имен классов учитывает разницу во времени компиляции.

Таким образом, единственные преимущества/недостатки применимы к читабельности.

Только импорт минимального требуемого вам кажется лучше, потому что кто-то может посмотреть, что вы на самом деле используете. Тем не менее, IDE, вероятно, справляется с этим, и это спорный вопрос.

2

Выполнение явного импорта более безопасно во время компиляции, так как нет возможности конфликта классов. например

import java.sql.*; 
import java.util.*; 

вызывает проблему, если вы пытаетесь использовать класс Date (т. Е. Из какого пакета?).

Но кроме этого, характеристики производительности или памяти отсутствуют. Это чисто компиляция.

2

Преимущество импорта с использованием «*» заключается в том, что он меньше строк кода и меньше набирает текст. Это более важно, если вы делаете свое кодирование с помощью «немого» текстового редактора, а не с IDE, чем можете использовать эллипсы для скрытия импорта и можете добавлять импорт полуавтоматически.

Недостатки импорта с помощью «*» являются:

  • Вы импортируются коллизий имен класса иногда; например когда какое-то имя класса используется для классов в разных пакетах, и вы импортируете оба из них.
  • Вы не можете видеть явные зависимости классов, просматривая импорт. Но это менее важно, если ваша среда IDE может показать вам зависимости каким-то другим способом.
0

Любая достойная IDE будет помещена в операторы импорта для вас и многое другое. Получите лучшую IDE, если это проблема для вас.

IntelliJ делает это; так же как и Eclipse. Я сам не использую NetBeans, но я бы поспорил, что это так.

Смежные вопросы