Подтвердить что ты не робот

Каков правильный стиль для листинга импорта на Java?

Лучше ли перечислять каждую отдельную часть пакета, который вам понадобится (см. № 1), или лучше просто импортировать все из пакета (см. # 2)?

1

import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.ColorConvertOp;

2

import java.awt.*;
4b9b3361

Ответ 1

Это НЕ просто вопрос стиля; import-on-demand может привести к тому, что код перестает компилироваться по мере добавления новых классов к существующим пакетам.

Основная идея (Подробнее см. http://javadude.com/articles/importondemandisevil.html.):

import java.awt.*;
import java.util.*;
...
List list;

работал в Java 1.1; с Java 1.2, вышеуказанный код больше не будет компилироваться.

Импорт по требованию EVIL, потому что ваша программа может прекратить компиляцию, когда новые классы добавляются в существующие пакеты!

ВСЕГДА используют явный импорт. Это не вопрос стиля; это вопрос безопасности.

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

(Импорт по требованию - пример очень плохой функции языка программирования - никакая функция не должна прерывать код при добавлении новых типов в систему!)

Ответ 2

Использовать импорт отдельно.

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

В то время как среда IDE делает отличную работу, помогая вам узнать, какие классы используются, более читаемо знать, что вы имеете в виду:

java.util.List;

а не

java.awt.List; 

и т.д.

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

 import java.util.List;
 import java.util.ArrayList;
 import java.util.Date;

 import javax.swing.JFrame;
 import javax.swing.JPanel;

 import javax.swing.event.TableModelListener;

 import org.apache.commons.httpclient.cookie.CookiePolicy;
 import org.apache.commons.httpclient.cookie.CookieSpec;

 import your.own.packagename.here.SomeClass;
 import your.own.packagename.here.OtherClass;

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

Ответ 3

Последний обычно считается "плохим". С поддержкой инструмента нет никаких оправданий, чтобы не перечислять их отдельно, и он устраняет любую двусмысленность.

Помните, что Eclipse по умолчанию использует подстановочные знаки для статического импорта и явный импорт для обычных. Не уверен, почему он делает это различие.

edit: различие очевидно в ретроспективе - статический импорт часто относится к статическим методам, и вы не можете однозначно ссылаться на статический метод по имени (из-за перегрузки). Поэтому, если он не может быть полностью однозначным, вы также можете использовать подстановочный знак.

Ответ 4

Если вы перечислите их индивидуально, их легче обнаружить при чтении кода с помощью простого редактора (а не изнутри среды dev), из которого возникают объекты пакета. При чтении кода из сложных проектов это может сэкономить значительное время. Имел пример того, что ранее сегодня, на самом деле, когда я изучал код из большого проекта с открытым исходным кодом, не желая загружать все в eclipse.

Ответ 5

Я знаю, что речь идет не о производительности, а о стоимости импортных заявлений вопрос месяца о javaperformancetuning.com прекрасно суммировать, почему вам следует избегать использования подстановочных знаков:

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

Итак, полный ответ

  • Не существует затрат времени исполнения от использования оператора импорта
  • Процесс компиляции может занять немного больше времени с импортом Заявление
  • Процесс компиляции может занять еще больше времени с помощью подстановочного импорта Заявление
  • Для повышения удобочитаемости операторы импорта подстановочных знаков являются плохой практикой для ничего, кроме классов броска
  • Накладные расходы на компиляцию для операторов без подстановочных импортов: незначительные, но они дают читаемость преимущества, поэтому наилучшей практикой является использование их

Это является неправильной практикой использования операторов импорта wilcard, они делают код менее читаемым, просто не делайте этого. Единственным исключением из этого правила является статический импорт, например import static org.junit.Assert.*;. Нет, я не хочу импортировать каждый assertXXX отдельно, и я не считаю, что это вредит читаемости кода.

Ответ 6

Здесь нет ни одного правильного ответа.

Люди, которые принесли вам Eclipse, проголосовали за индивидуальный импорт, так как Source/Organize Imports преобразует * форму в конкретную форму.

Ответ 7

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

Большинство IDE, которые мне известны, выбирают вариант 1 выше. Это согласуется с некоторыми инструментами анализа кода, которые я использовал в прошлом (например, checkstyle), поскольку они считают неправильной практикой использовать нотацию *.

Ответ 8

Опция 1, которую вы указали, предпочтительнее, но если есть больше классов, которые вы импортируете из java.awt.image, тогда желательно, чтобы у них был только один импорт java.awt.image. * Большинство IDE позволяют указать точное количество от количества импортируемых товаров. Например, в IDEA мы можем использовать File->Settings->Code Style->imports. На вкладке "Общие" есть поле Class count to use import with *, а значение по умолчанию - 5.

Ответ 9

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

Ответ 10

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