Получить доступ

Когда корректно ставить @SafeVarargs на generic-varargs-метод?

SeniorДженерики
Коротко

Ставят, когда метод только читает элементы generic-varargs и не сохраняет и не отдаёт созданный массив T[] наружу. Тогда heap pollution невозможен, и аннотация убирает предупреждение у вызывающих.

  • Небезопасно: вернуть массив args или положить в него что-то
  • Применима к static, final и private методам и конструкторам
  • В JDK: List.of(E...), Arrays.asList, EnumSet.of

А ещё Аннотация — обещание программиста, компилятор его не проверяет

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

generic varargs (T...) под капотом создают массив T[], а массив дженериков небезопасен (heap pollution). Если метод только перебирает элементы и не публикует сам массив, он безопасен — это и помечает @SafeVarargs, убирая предупреждение у вызывающих. Ставить её на метод, который кладёт в массив или возвращает его, — ошибка.

Что хотят услышать

  • Условие безопасности.
  • Пример небезопасного метода.

Частые ошибки

  • Помечать @SafeVarargs метод, публикующий массив.
  • Считать аннотацию универсальным глушителем варнингов.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Когда метод только ЧИТАЕТ элементы и не хранит/не публикует внутренний массив T[] наружу — тогда heap pollution невозможен
  • ✗Всегда — аннотация просто убирает любой варнинг
  • ✗Когда метод складывает элементы в массив и возвращает его наружу
  • ✗Только для методов без аргументов

Что спросят дальше

  • Что такое heap pollution?
  • Почему generic varargs вообще создают предупреждение?

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем