Опирается на правила:
JS-3.1…JS-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;
Группы:
java.*,javax.*(стандарт).- third-party (
org.*,com.*ваших OSS-зависимостей). - 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.1 | import static com.example.OrderService.METHOD |
| Unused imports | JS-3.2 | IDE auto-cleanup при save |
import com.example.foo.Order; и import com.other.Order; (conflict) | JS-3.2 | fully-qualified для одного |
| Mixed order (java, com, java) | conv | alphabetical + group separation |
Без CustomImportOrder в Checkstyle | JS-CS-2 | enforce |
Куда дальше
- Java → раздел 3. Импорты — нормативные формулировки.
- Именование — пакеты в нижнем регистре.
- Выражения — лямбды, method references.
- Checkstyle —
AvoidStarImport,UnusedImports.