Вопрос с собеседования · Java

Зачем нужен паттерн Visitor, какова его цена и чем его можно заменить в современной Java?

SeniorПаттерны проектированияJava >=21
Коротко

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?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования