Annotazione Java @SafeVarargs

1. Panoramica

In questo breve tutorial, daremo uno sguardo all'annotazione @SafeVarargs .

2. L' annotazione @SafeVarargs

Java 5 ha introdotto il concetto di varargs, o un parametro del metodo di lunghezza variabile, così come i tipi parametrizzati.

La combinazione di questi può causare problemi per noi:

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 }

Questi problemi sono difficili da confermare per un compilatore, quindi fornisce avvisi ogni volta che i due vengono combinati, come nel caso di unsafe:

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

Questo metodo, se utilizzato in modo errato, come nel caso di un guasto , inquinerà un array Object [] nell'heap invece del tipo previsto b .

Per eliminare questo avviso, possiamo aggiungere l' annotazione @SafeVarargs sui metodi e sui costruttori finali o statici .

@SafeVarargs è come @SupressWarnings in quanto ci consente di dichiarare che un particolare avviso del compilatore è un falso positivo. Dopo esserci assicurati che le nostre azioni siano sicure , possiamo aggiungere questa annotazione:

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

L'uso sicuro di vararg è un concetto complicato in sé e per sé. Per ulteriori informazioni, Josh Bloch ha un'ottima spiegazione nel suo libro, Effective Java.

3. Conclusione

In questo breve articolo, abbiamo visto come utilizzare l' annotazione @SafeVarargs in Java.

Il codice sorgente completo per gli esempi può essere trovato su GitHub.