Annotation Java @SafeVarargs

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons jeter un œil à l' annotation @SafeVarargs .

2. L' annotation @SafeVarargs

Java 5 a introduit le concept de varargs, ou un paramètre de méthode de longueur variable, ainsi que des types paramétrés.

La combinaison de ces éléments peut nous causer des problèmes:

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 }

Ces problèmes sont difficiles à confirmer pour un compilateur, et il donne donc des avertissements chaque fois que les deux sont combinés, comme dans le cas de unsafe:

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

Cette méthode, si elle n'est pas utilisée correctement, comme dans le cas de cassé , polluera un tableau Object [] dans le tas au lieu du type prévu b .

Pour écraser cet avertissement, nous pouvons ajouter l' annotation @SafeVarargs sur les méthodes et les constructeurs finaux ou statiques .

@SafeVarargs est comme @SupressWarnings en ce qu'il nous permet de déclarer qu'un avertissement particulier du compilateur est un faux positif. Une fois que nous nous assurons que nos actions sont sécurisées , nous pouvons ajouter cette annotation:

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

L'utilisation sûre de varargs est un concept délicat en soi. Pour plus d'informations, Josh Bloch a une excellente explication dans son livre, Effective Java.

3. Conclusion

Dans cet article rapide, nous avons vu comment utiliser l' annotation @SafeVarargs en Java.

Le code source complet des exemples est disponible à l'adresse over sur GitHub.