Зачем нужен паттерн Visitor, какова его цена и чем его можно заменить в современной Java?
Visitor выносит операции за пределы иерархии: удобно, когда типы стабильны, а операций много. Цена — асимметрия: новая операция дешёвая, новый тип требует править всех визиторов. В Java 21 его заменяет sealed-иерархия + switch с pattern matching — компилятор сам проверит полноту.
- Примеры: обход AST, FileVisitor в NIO
- Двойная диспетчеризация: accept вызывает visit с конкретным типом
- switch по sealed не требует accept-методов в классах
А ещё Новый тип в sealed-иерархии — компилятор укажет все незакрытые switch
Подробно
Объясни задачу: если операций много, а иерархия стабильна, держать каждую операцию методом в каждом классе неудобно — визитор выносит их наружу. Обязательно назови асимметрию: добавление операции дешёвое, добавление типа дорогое, потому что править придётся всех визиторов. Приведи примеры из платформы (FileVisitor, ElementVisitor) и заверши современной альтернативой: sealed-иерархия закрывает набор наследников, switch с pattern matching становится исчерпывающим, и компилятор сам укажет все места, требующие правки. Это тот же контроль полноты, что давал визитор, но без ритуала accept/visit.
Что хотят услышать
- Задача паттерна.
- Асимметрия расширения.
- Современная замена.
Частые ошибки
- Забывать про асимметрию цены и подавать визитор как безусловно гибкое решение.
- Не замечать, что sealed-типы сознательно жертвуют OCP ради исчерпываемости.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Выносит операции за иерархию; замена — sealed и switch
- ✗Позволяет добавлять новые типы в иерархию без правки существующего кода и визиторов
- ✗Нужен для обхода коллекций; в современной Java полностью заменён циклом for-each по элементам
- ✗Создаёт объекты нужного подкласса по имени типа, переданному строкой
Что спросят дальше
- Что такое двойная диспетчеризация?
- Как sealed-типы меняют компромисс с OCP?
Разбор темы
- Поведенческие паттерны
Strategy, Template Method, Observer, Command, Chain of Responsibility, State, Iterator и Visitor — с примерами из JDK, Spring и заменой паттернов лямбдами и sealed-типами.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.