Импорт пакета.* против пакета импорта.SpecificType [дубликат]


этот вопрос уже есть ответ здесь:

будет ли это предполагать какую-либо разницу в отношении накладных расходов для записи импорта, загружающего все типы в одном пакете (import java.*); чем просто определенный тип (т. е. import java.lang.ClassLoader)? Бы Второй быть более целесообразный способ использования, чем другой?

10 82

10 ответов:

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

взгляните на Java API, и вы увидите много классов и интерфейсов с одинаковым именем в разных пакетах.

например:

java.lang.reflect.Array
java.sql.Array

Итак, если вы импортируете java.lang.reflect.* и java.sql.* вы столкнетесь с типом массива и должны полностью квалифицировать их в своем коде.

импорт конкретных классов вместо этого избавит вас от этой хлопот.

Это на самом деле очень серьезная проблема.

Предположим, вы пишите

import a.*;
import b.*;
...
Foo f;

и класс Foo существует в пакете a.

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

пуф! Теперь ваш код отказывается компилироваться.

никогда использовать импорт по требованию. Это зло!

см.http://javadude.com/articles/importondemandisevil.html для более подробной информации.

RE производительность:

import a.*;

vs

import a.X;

не имеет значения во время выполнения. Компилятор жестко связывает разрешенные имена классов в сгенерированные .файл класса.

посмотреть в меньшинстве: в моем коде я обычно использую тонны классов из нескольких пакетов вместе с несколькими нечетными классами здесь и там. Мне нравится держать свой список импорта маленьким, чтобы я мог сразу сказать, что происходит. Для этого я установил порог в 4 класса. Кроме того, Eclipse будет использовать * для моего кода. Я нахожу, что это держит мой импорт пакетов читаемым, и я склонен ссылаться на них как на первое, что я делаю когда я смотрю на класс, чтобы ответить на вопрос: Кому это говорить чтобы?

Что Касается Столкновения Имен: каковы шансы, что вы импортируете четырех или более классов из двух пакетов, которые имеют конкурирующие имена классов? Если это более 10% времени, вы можете рассмотреть количество пакетов, на которые опирается ваш класс (например, рефакторинг его на более мелкие классы).

хорошая причина никогда не использовать импорт xxx.* это иметь четкое видение зависимости.

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

после поиска дополнительной информации, я наткнулся на этот сайт, где это очень хорошо объяснено. вопрос и влияет ли использование * в инструкции импорта на производительность?.

есть ли проблема эффективности между этими двумя стилями? Возможно, но поскольку объявления импорта фактически ничего не импортируют в вашу программу, любая разница очень мала. Помните, что есть неявный импорт java.ленг.* в верхней части ваших единиц компиляции, и Ява.lang в JDK 1.2.2 содержит 75 классов и интерфейсов. Эксперимент с использованием надуманного примера, в котором используются тысячи имен классов, которые необходимо искать, показал незначительное изменение скорости компиляции. Поэтому производительность компиляции, вероятно, не следует рассматривать как фактор при выборе одного формата над другим.

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

package P;

public class A {
    public static class B {}
}

Если вы хотите получить доступ к другой блок компиляции, вы говорите:

import P.*;

или: импорт П. А; Но если вы хотите получить доступ к B без квалификации, Вы должен сказать:

import P.A.*;

или: импорт П. А. Б; Первый из них делает доступными типы в классе A, найденном в пакете P. второй делает доступным только тип B, найденный в классе A в пакете P.

Если вы импортируете более 20 классов из одного пакета, вам лучше использовать import xxx.*. "Чистый код" также выступает за импорт всего пакета.

Я склонен использовать все, что IDE по умолчанию. Я считаю, что это не то, о чем действительно стоит беспокоиться, поскольку это не влияет на производительность, и проверка зависимостей может быть обработана с помощью различных инструментов.

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

Я считаю, что лучше: a) быть явным, перечисляя все импорта b) позвольте вашей IDE управлять им. Любой из основных IDE может автоматически обновлять, сортировать и завершать импорт.

Я нашел a), чтобы пригодиться пару раз при выполнении ручной переупаковки вне контекста рефакторинга в IDE. Например, когда маркетинг меняет название вашего продукта и решает, что все ваши пакеты должны изменить имя.

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