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.