Java @SafeVarargs Annotation

1. Übersicht

In diesem kurzen Tutorial sehen wir uns die Annotation @SafeVarargs an .

2. Die Annotation @SafeVarargs

Java 5 führte das Konzept von Varargs oder einem Methodenparameter variabler Länge sowie parametrisierte Typen ein.

Die Kombination dieser kann uns Probleme bereiten:

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 }

Diese Probleme sind für einen Compiler schwierig zu bestätigen und geben daher Warnungen aus, wenn beide kombiniert werden, wie im Fall von unsicheren:

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

Diese Methode verschmutzt bei falscher Verwendung, wie im Fall von defekt , ein Object [] -Array anstelle des beabsichtigten Typs b in den Heap . B.

Um diese Warnung zu unterdrücken , können wir die Annotation @SafeVarargs zu endgültigen oder statischen Methoden und Konstruktoren hinzufügen .

@SafeVarargs ist insofern wie @SupressWarnings , als es uns ermöglicht zu deklarieren, dass eine bestimmte Compiler-Warnung falsch positiv ist. Sobald wir sichergestellt haben, dass unsere Aktionen sicher sind , können wir diese Anmerkung hinzufügen:

public class Machine { private List versions = new ArrayList(); @SafeVarargs public final void safe(T... toAdd) { for (T version : toAdd) { versions.add(version); } } }

Die sichere Verwendung von Varargs ist an und für sich ein heikles Konzept. Für weitere Informationen hat Josh Bloch eine großartige Erklärung in seinem Buch Effective Java.

3. Fazit

In diesem kurzen Artikel haben wir gesehen, wie die Annotation @SafeVarargs in Java verwendet wird.

Den vollständigen Quellcode für die Beispiele finden Sie auf GitHub.