Je suis passé à une nouvelle machine qui a le dernier compilateur Java de Sun) et j'ai remarqué quelques avertissements dans le code Java 6) existant. L'IDE Eclipse, m'a suggéré d'annoter la mission avec:
@SuppressWarnings("rawtypes")
Par exemple:
class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();
Lorsque je suis revenu sur la machine avec l'ancien compilateur (JDK 1.6.0_20), j'ai remarqué que cet ancien compilateur avertit maintenant de la suppression des avertissements "rawtypes", affirmant que cette suppression n'est pas prise en charge et proposant de la remplacer par @SuppressWarnings ("décoché"). En outre, il y avait des endroits où le plus récent compilateur, par défaut, m'a obligé à mettre à la fois "non vérifié" et "rawtypes" - la compilation de ce code avec l'ancien compilateur reproduit le même avertissement.
Comment puis-je appliquer la compatibilité ascendante/descendante entre les deux, afin qu'aucun compilateur ne produise d'avertissements?
Vous pouvez utiliser la @SuppressWarnings("unchecked")
qui est prise en charge par le compilateur Eclipse et javac.
Mais rappelez-vous que l'annotation @SuppressWarnings
Est utilisée par votre compilateur qui peut avoir ses propres valeurs. Le JLS force uniquement le compilateur à comprendre les valeurs "non vérifiées" et "obsolètes" (pour l'instant).
Les fournisseurs de compilateurs doivent documenter les noms d'avertissement qu'ils prennent en charge conjointement avec ce type d'annotation. Ils sont encouragés à coopérer pour s'assurer que les mêmes noms fonctionnent sur plusieurs compilateurs.
Si vous utilisez Helios, vous devrez définir une option spécifique pour autoriser @SuppressWarnings("unchecked")
au lieu de @SuppressWarnings("rawtypes")
,
Dans le cas où il n'est pas possible de mettre à jour le code avec le nouveau jeton, la propriété système
suppressRawWhenUnchecked=true
Peut être définie lors du démarrage d'Eclipse.
Ressources:
EDIT: Voici l'article knol maintenant indisponible qui a été utilisé comme référence, écrit à l'origine par Alex Miller .
@SuppressWarnings Annotation en Java
Annotation standard pour supprimer divers avertissements
L'annotation SuppressWarnings a été ajoutée en tant qu'annotation standard dans Java SE 5.
Définition
L'annotation @ SuppressWarnings est définie dans la spécification de langage Java section 9.6.1.5 . Cette section indique:
Le type d'annotation
SuppressWarnings
prend en charge le contrôle du programmeur sur les avertissements autrement émis par le compilateur Java. Il contient un seul élément qui est un tableau deString
. Si un programme est annotée avec l'annotation@SuppressWarnings(value = {S1, ... , Sk})
, puis un compilateur Java ne doit pas signaler d'avertissement identifié par l'un des S1, ..., Sk si cet avertissement aurait été généré à la suite de la déclaration annotée ou de l'une de ses parties.Les avertissements non vérifiés sont identifiés par la chaîne "
unchecked
".La suite section sur
@Deprecation
Mentionne également que ces avertissements peuvent être supprimés avec@SuppressWarnings("deprecation")
.Types d'avertissement valides
Les deux seules chaînes d'avertissement qui sont mentionnées dans la spécification elle-même sont "non vérifiées" et "obsolètes". Cependant, le Sun JDK utilise un plus grand ensemble de chaînes dans le compilateur. Vous pouvez déterminer l'ensemble actuel en exécutant:
javac -X
qui vous montrera (entre autres) les paramètres valides pour -Xlint.
Par exemple, Sun JDK 1.5 affiche:
- all - supprime tous les avertissements de ce code
- obsolète - supprimer les avertissements de l'utilisation de code obsolète
- unchecked - supprime les avertissements d'un appel non contrôlé ou d'un cast non contrôlé
- fallthrough - supprime les avertissements si un commutateur tombe à travers sans trouver un cas valide (et pas de défaut)
- chemin -
- serial - supprime les avertissements si une classe Serializable ne définit pas un serialVersionUID
- enfin - supprime les avertissements de retour dans un finalement (qui ignorera le retour avec l'essai)
Et Sun JDK 1.6 ajoute:
- jeter
- divzero - supprime les avertissements si une division entière par zéro est détectée
- vide
- remplace
- none
Les IDE et les outils d'analyse statique prennent généralement en charge un grand nombre d'autres valeurs possibles pour @SuppressWarnings. Ces valeurs correspondent à des contrôles d'analyse statique spécifiques effectués par l'EDI.
Éclipse
Les valeurs d'avertissement Eclipse pour Eclipse 3.3 sont documentées dans les documents JDT .
- tous - supprimer tous les avertissements
- boxe - supprime les avertissements relatifs aux opérations de boxe/déballage
- cast - supprime les avertissements relatifs aux opérations de cast
- dep-ann - supprime les avertissements relatifs aux annotations obsolètes
- dépréciation - supprimer les avertissements relatifs à la dépréciation
- fallthrough - supprime les avertissements relatifs aux ruptures manquantes dans les instructions switch
- enfin - supprime les avertissements relatifs au bloc finalement qui ne revient pas
- masquage - supprime les avertissements relatifs aux sections locales qui masquent la variable
- commutateur-incomplet - supprime les avertissements relatifs aux entrées manquantes dans une instruction switch (cas enum)
- nls - supprime les avertissements relatifs aux littéraux de chaîne non nls
- null - supprime les avertissements relatifs à l'analyse nulle
- restriction - supprimer les avertissements relatifs à l'utilisation de références découragées ou interdites
- serial - supprime les avertissements relatifs au champ serialVersionUID manquant pour une classe sérialisable
- static-access - supprime les avertissements relatifs à un accès statique incorrect
- accès synthétique - supprime les avertissements relatifs à l'accès non optimisé des classes internes
- unchecked - supprime les avertissements relatifs aux opérations non contrôlées
- unqualified-field-access - supprime les avertissements relatifs à l'accès au champ non qualifié
- inutilisé - supprime les avertissements relatifs au code inutilisé
IntelliJ
NetBeans
Exemples
Un exemple de spécification d'un seul avertissement:
@SuppressWarnings("unchecked") public void methodWithScaryWarnings() { List rawList = new ArrayList(); List<String> stringList = (List<String>)rawList; }
Un exemple d'utilisation de deux avertissements:
@SuppressWarnings({"unchecked","deprecation"}) public void methodWithScaryWarnings() { callDeprecatedMethod(); }
Notez qu'Eclipse 3.5 ne comprend pas les types bruts et signale un avertissement pour passer à non coché. Il est frustrant qu'Eclipse ait proposé une annotation de types bruts qui pose plus de problèmes que de résolution. Ils auraient dû juste s'en tenir à celui standard.