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

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

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

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

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

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