Анотация на Java @SafeVarargs

1. Общ преглед

В този бърз урок ще разгледаме анотацията @SafeVarargs .

2. Анотация @SafeVarargs

Java 5 въведе концепцията за varargs или параметър на метод с променлива дължина, както и параметризирани типове.

Комбинирането им може да създаде проблеми за нас:

public static  T[] 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 }

Тези проблеми са трудни за потвърждение от компилатора и затова той дава предупреждения, когато двете се комбинират, както в случая на опасно:

warning: [unchecked] Possible heap pollution from parameterized vararg type T public static  T[] unsafe(T... elements) {

Този метод, ако се използва неправилно, както в случая на счупен , ще замърси масив Object [] в купчината вместо предвидения тип b .

За да смачкаме това предупреждение, можем да добавим анотацията @SafeVarargs за крайни или статични методи и конструктори .

@SafeVarargs е като @SupressWarnings, тъй като ни позволява да декларираме, че дадено предупреждение на компилатора е фалшиво положително. След като се уверим, че действията ни са безопасни , можем да добавим тази анотация:

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.