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?
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")
.