Когда корректно ставить @SafeVarargs на generic-varargs-метод?
Ставят, когда метод только читает элементы 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 вообще создают предупреждение?
Разбор темы
- Дженерики: массивы, varargs и bridge-методы
Почему дженерики не дружат с массивами, heap pollution и @SafeVarargs, синтетические bridge-методы и reifiable-типы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.