Anotação Java @SafeVarargs

Anotação Java @SafeVarargs

1. Visão geral

Neste tutorial rápido, daremos uma olhada na anotação@SafeVarargs.

2. A anotação@SafeVarargs

O Java 5 introduziu o conceito de varargs, ou um parâmetro de método de comprimento variável, além de tipos parametrizados.

Combinar isso pode causar problemas para nós:

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
}

Esses problemas são complicados para um compilador confirmar, e por isso ele dá avisos sempre que os dois são combinados, como no caso deunsafe:

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

Este método, se usado incorretamente, como no caso debroken,will pollute an Object[] array into the heap instead of the intended type b.

Para reprimir esse aviso, podemos adicionar a anotação@SafeVarargson final or static methods and constructors.

@SafeVarargs é como@SupressWarnings porque nos permite declarar que um determinado aviso do compilador é um falso positivo. Once we ensure our actions are safe, podemos adicionar esta anotação:

public class Machine {
    private List versions = new ArrayList<>();

    @SafeVarargs
    public final void safe(T... toAdd) {
        for (T version : toAdd) {
            versions.add(version);
        }
    }
}

O uso seguro de varargs é um conceito complicado por si só. Para obter mais informações, Josh Bloch tem uma ótima explicação em seu livro,Effective Java.

3. Conclusão

Neste artigo rápido, vimos como usar a anotação@SafeVarargs em Java.

O código-fonte completo dos exemplos pode ser encontradoover on GitHub.