Assert в проде — рабочий код до флага -ea

Классический антипаттерн: разработчик ставит assert для проверки инварианта в бизнес-логике и уверен, что при нарушении условия приложение упадёт с понятной ошибкой.

Проблема в том, что assertions в JVM выключены по умолчанию. Флаг -ea (enable assertions) нужно передавать явно при старте JVM. Без него код внутри assert просто не выполняется — интерпретатор пропускает всю инструкцию целиком, включая побочные эффекты.

assert validateOrder(order) : "Invalid order state";

Если validateOrder() должен был не только проверить, но и что-то сделать — например залогировать метрику — этот код в проде никогда не выполнится, потому что тестовые контуры обычно гоняют с -ea, а прод-конфигурация — без него.

Спросят следом: зачем тогда вообще assert существует, если его так легко выключить. Ответ — это инструмент для проверки инвариантов при разработке и тестировании, а не механизм валидации бизнес-правил в проде. Для проверок, которые должны работать всегда, нужны обычные исключения — IllegalStateException, IllegalArgumentException, явные if с throw.

Assert — это заметка для себя и для тестового окружения. Бизнес-инварианты, которые обязаны сработать в проде, проверяются обычным кодом, не assert.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки