Est-ce que @SafeVarargs est une annotation appropriée pour cette méthode?

j'ai un peu de code Java (en utilisant la classe Guava ImmutableList ):

@Nonnull
public static <E extends Event> UserHistory<E> forUser(long id, E... events) {
    List<E> list = ImmutableList.copyOf(events);
    return new BasicUserHistory<E>(id, list);
}

je reçois les Avertissements habituels de pollution tas qui viennent avec une méthode comme celle-ci. Puisque ma méthode ne fait aucune modification de events , elle ne peut pas introduire une pollution de tas. Cependant, si (à cause de l'effacement) un client de cette méthode l'appelle avec un mauvais tableau events , il semble qu'il peut propager une production de tas à travers m'.

si je l'annote avec @SafeVarargs , je reçois quand même un avertissement (suppressible avec @SuppressWarnings("varargs") ). Mais en lisant la documentation Java sur heap pollution , Je ne suis pas très clair quant à l'ensemble correct d'annotations sur cette méthode.

je note aussi que ImmutableList.copyOf est pas marqué @SafeVarargs (bien que cela pourrait être simplement un problème de compatibilité), mais Arrays.asList est.

donc, ma question: @SafeVarargs est une annotation appropriée pour cette méthode, étant donné qu'elle ne rencontrera pas un ClassCastException , mais pourrait propager un tableau incorrectement vérifié jusqu'au type paramétré final et permettre un ClastCastException dans le code client?

je crois, basé sur cette réponse , qu'il est sûr, puisque le code ne fait rien qui dépend du type de events lui-même, seulement sur le type de ses éléments. Est-ce une application correcte du guide?

9
demandé sur Community 2015-05-08 21:11:21

1 réponses

Oui, @SafeVarargs doit être approprié, parce que la seule chose qui est fait avec events est pour le passer à ImmutableList.copyOf() , qui, dans ma compréhension de cette méthode) ne dépend pas de l'exécution type de ce tableau.

ImmutableList.copyOf() devrait être annotée avec @SafeVarargs , mais il ne l'est pas (peut-être pour rétrocompatibilité ou ils ne l'ont pas remarqué). Lorsque votre méthode varargs Non réifiable passe le paramètre varargs à une autre méthode qui peut potentiellement dépendre du type d'exécution du tableau, alors (pour des raisons que je ne comprends pas totalement, mais qui fait l'objet de cette question ) elle vous donne un avertissement varargs pour cet appel. Ceci peut être supprimé avec @SuppressWarnings("varargs") .

10
répondu newacct 2015-05-11 22:52:09