Опирается на правила: JS-3.1JS-3.2 из Java Style Guide → раздел 3. Импорты.

Важно знать

  • Не wildcard (import some.package.*) — скрывает источники классов.
  • Исключениеjava.util.* допустим (часто, читабельно).
  • Не оставлять unused — Checkstyle UnusedImports блокирует.
  • IDE auto-cleanup при save должен быть включён в командных настройках.
  • Wildcard → нестабильная сборка при добавлении класса с тем же именем.

Импорты — техническая часть файла, но имеют значение. Wildcard скрывает, какие именно классы используются — затрудняет review и может ломать сборку. Unused imports — мёртвый код, увеличивающий шум.

Не wildcard

JS-3.1: явные импорты.

// ✓
import java.util.List;
import java.util.Map;
import com.example.OrderService;
import com.example.PaymentService;

// ✗
import java.util.*;
import com.example.*;

Проблемы wildcard:

Скрывает источники

// Wildcard
import com.example.*;
import com.other.lib.*;

public class Handler {
    public void process(Order order) { ... }  // Order из com.example или com.other?
}

Найти, откуда Order — нужно открыть IDE, hover. Phylogeny find . | grep Order — N матчей. Review через GitHub diff — невозможно.

Коллизии при добавлении

import com.example.* подтягивает все классы. Если в com.example добавится класс с тем же именем, что в java.util.* — compilation error или silent change в семантике.

Diff в commit history

Один новый класс в com.example — не отражается в imports (wildcard уже импортирует). Reviewer не видит «теперь зависим от нового класса».

Исключение: java.util.*

JS-3.1 (исключение): для java.util допустим.

import java.util.*;   // ✓ — стандартная конвенция

Причины:

  • java.util — большой пакет, в одном файле часто используется List, Map, Set, Optional, HashMap, ArrayList, Collections, Comparator — 8 импортов вместо одного.
  • Источник known — стандартная Java, не путаница с custom-кодом.
  • Команда читает быстро, без дополнительного навигации.

Для остальных пакетов — явные импорты.

Не оставлять unused

JS-3.2: чистить.

// ✗ — unused import
import java.util.List;
import com.example.UnusedService;

public class OrderHandler {
    private final OrderService orderService;
    // List не используется, UnusedService не используется
}

Проблемы:

  • Cognitive load — читатель сканирует imports чтобы понять зависимости класса.
  • False signal — unused import говорит «я завишу от этого», но это неправда.
  • Refactoring noise — при rename / delete класса unused импорты ломают сборку, хоть и не использовались.

IDE auto-cleanup

В IntelliJ IDEA — Preferences → Editor → General → Auto Import:

  • Add unambiguous imports on the fly
  • Optimize imports on the fly

При save файла unused imports удаляются автоматически.

Команда коммитит командные настройки через .editorconfig + IDE schema export — все разработчики работают одинаково.

Checkstyle блокирует

<module name="UnusedImports"/>
<module name="AvoidStarImport"/>

(см. Checkstyle).

При наличии unused — ./gradlew check фейлится, CI блокирует merge.

Порядок импортов

Java Style Guide не диктует строгий порядок, но конвенция — alphabetical with group separation:

import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

import com.example.order.OrderService;
import com.example.payment.PaymentService;

import org.springframework.stereotype.Component;

Группы:

  1. java.*, javax.* (стандарт).
  2. third-party (org.*, com.* ваших OSS-зависимостей).
  3. local project (com.example.*).

Между группами — пустая строка. Внутри группы — alphabetical.

IntelliJ настраивается через Preferences → Editor → Code Style → Java → Imports. Командный settings.xml экспортируется в репо.

Checkstyle через CustomImportOrder enforce-ит порядок:

<module name="CustomImportOrder">
    <property name="customImportOrderRules" value="STANDARD_JAVA_PACKAGE###THIRD_PARTY_PACKAGE###SPECIAL_IMPORTS"/>
    <property name="separateLineBetweenGroups" value="true"/>
</module>

Что запрещено

АнтипаттернПравилоЧто взамен
import com.example.*JS-3.1явные импорты
import com.example.OrderService.* (static с wildcard)JS-3.1import static com.example.OrderService.METHOD
Unused importsJS-3.2IDE auto-cleanup при save
import com.example.foo.Order; и import com.other.Order; (conflict)JS-3.2fully-qualified для одного
Mixed order (java, com, java)convalphabetical + group separation
Без CustomImportOrder в CheckstyleJS-CS-2enforce

Куда дальше

  • Java → раздел 3. Импорты — нормативные формулировки.
  • Именование — пакеты в нижнем регистре.
  • Выражения — лямбды, method references.
  • Checkstyle — AvoidStarImport, UnusedImports.