1. Обзор
В этом кратком руководстве мы рассмотрим аннотацию @SafeVarargs .
2. Аннотация @SafeVarargs
В Java 5 введено понятие varargs, или параметра метода переменной длины, а также параметризованных типов.
Сочетание этих факторов может вызвать у нас проблемы:
public staticT[] unsafe(T... elements) { return elements; // unsafe! don't ever return a parameterized varargs array } public static T[] broken(T seed) { T[] plant = unsafe(seed, seed, seed); // broken! This will be an Object[] no matter what T is return plant; } public static void plant() { String[] plants = broken("seed"); // ClassCastException }
Эти проблемы сложно подтвердить компилятору, и поэтому он выдает предупреждения всякий раз, когда они объединяются, как в случае unsafe:
warning: [unchecked] Possible heap pollution from parameterized vararg type T public staticT[] unsafe(T... elements) {
Этот метод, если он используется неправильно, как в случае broken , будет загрязнять массив Object[] в кучу вместо предполагаемого типа b .
Чтобы подавить это предупреждение, мы можем добавить @SafeVarargs аннотацию на окончательные или статические методы и конструкторы .
@@SafeVarargs похож на @Suppresswarnings в том, что он позволяет нам объявить, что конкретное предупреждение компилятора является ложноположительным. Как только мы убедимся , что наши действия безопасны , мы можем добавить эту аннотацию:
public class Machine{ private List versions = new ArrayList<>(); @SafeVarargs public final void safe(T... toAdd) { for (T version : toAdd) { versions.add(version); } } }
Безопасное использование varargs само по себе является сложной концепцией. Для получения дополнительной информации у Джоша Блоха есть отличное объяснение в его книге Эффективная Java .
3. Заключение
В этой краткой статье мы рассмотрели, как использовать аннотацию @SafeVarargs в Java.
Полный исходный код примеров можно найти на GitHub .