Java 7 introdujo el @SafeVarargs anotación para suprimir las advertencias de operaciones inseguras que ocurren cuando un método tiene varargs (número variable de argumentos). La anotación @SafeVarargs solo se puede usar con métodos (constructores o métodos finales o estáticos) que no se pueden anular porque un método de anulación aún puede realizar operaciones inseguras en sus varargs (número variable de argumentos).
Java 9 ha extendido el uso de la anotación @SafeVarargs, ahora también se puede usar con métodos privados. Esto se debe a que los métodos privados no se pueden anular. Anteriormente, esta anotación se limitaba a métodos o constructores finales o estáticos, pero ahora se puede usar con métodos privados.
Ejemplo de Java 9: ¿Cuándo no usamos la anotación @SafeVarargs?
import java.util.ArrayList; import java.util.List; public class JavaExample{ // We are not using @SafeVarargs annotation - Java 9 private void print(List... names) { for (List<String> name : names) { System.out.println(name); } } public static void main(String[] args) { JavaExample obj = new JavaExample(); List<String> list = new ArrayList<String>(); list.add("Kevin"); list.add("Rick"); list.add("Negan"); obj.print(list); } }
Advertencias:
Type safety: Potential heap pollution via varargs parameter names Type safety: A generic array of List is created for a varargs parameter
Producción:
[Kevin, Rick, Negan]
Como puede ver, el código funcionó bien pero produjo pocas advertencias.
Captura de pantalla de este código en Eclipse Oxygen IDE que muestra advertencias.
Java 9 – Ejemplo de anotación @SafeVarargs
Ejecutemos el mismo código nuevamente después de usar la anotación @SafeVarargs.
import java.util.ArrayList; import java.util.List; public class JavaExample{ @SafeVarargs private void print(List... names) { for (List<String> name : names) { System.out.println(name); } } public static void main(String[] args) { JavaExample obj = new JavaExample(); List<String> list = new ArrayList<String>(); list.add("Kevin"); list.add("Rick"); list.add("Negan"); obj.print(list); } }
La misma salida sin previo aviso.
Nota: Si intenta compilar el código anterior en Java 7 y Java 8, obtendrá un error de compilación ya que estas mejoras se realizan en Java 9, antes de java 9: los métodos privados no se pueden marcar con esta anotación.