2010-06-25 4 views
2

Je veux une règle qui vérifie que les champs et les classes sont correctement annotés avec le concurrency java dans les annotations pratiques fournies par: http://mvnrepository.com/artifact/net.jcip/jcip-annotationsrègle checkstyle pour les annotations de jcip

Les champs doivent être annotée avec @GuardedBy et les classes doivent être annotée avec l'un de @Immutable, @ThreadSafe ou @NotThreadSafe.

J'ai une règle actuellement appliquée, qui garantit que les classes Spring Dao sont annotées avec @Repository au lieu de @Service ou @Component.

<module name="Regexp"> 
    <property name="format" 
     value="(@Component|@Service)(.*[\n])*.*class.*Dao.*\{" /> 
    <property name="message" 
     value="Daos sollten lieber mit @Repository annotiert werden." /> 
    <property name="illegalPattern" value="true" /> 
</module> 

Le problème avec cette approche est que je ne peux vérifier une annotation et dire que l'autre annotation devrait être mieux utilisé à la place. Cela ne m'aide pas avec la vérification d'annotation de jcip, parce que je ne peux pas vérifier "aucune annotation spécifique présente". Pour commencer, il serait cool si quelqu'un savait comment transformer le contrôle Dao ci-dessus en un contrôle qui garantit que @Repository est présent sur les classes dont les noms se terminent par Dao. Ce modèle pourrait ensuite être utilisé pour développer les vérifications d'annotations jcip.

Ou peut-être au lieu d'essayer de transformer la vérification de l'expression rationnelle, peut-être il y a un moyen d'implémenter les règles jcip avec le support de jeton de checkstyle? Cela rendrait peut-être la règle robuste.

Quoi qu'il en soit, je voudrais savoir comment s'assurer qu'une annotation spécifique doit être présente sur un élément spécifique via checkstyle. J'espère que quelqu'un le sait. :)

Répondre

2

trouvé la solution:

<module name="Regexp"> 
    <property name="format" value="(interface [a-zA-Z0-9 &lt;&gt;,\.]* \{|(@Immutable|@ThreadSafe|@NotThreadSafe)(.*[\n])*.*(class|enum) [a-zA-Z0-9\s&lt;&gt;,\.]* \{)" /> 
    <property name="message" value="Types must be annotated with @Immutable, @ThreadSafe, or @NotThreadSafe." /> 
    <property name="illegalPattern" value="false" /> 
</module> 

En outre, la vérification de @GuardedBy ne fait pas de sens, car cela dépend de la stratégie de synchronisation utilise la classe. Ainsi, il n'est pas toujours nécessaire d'ajouter @GuardedBy à la déclaration de champ. Et vérifier les cas où cela est nécessaire est entièrement trop complexe pour une simple règle de style de contrôle. :)

EDIT: Juste pour la cohérence, j'ai mis à jour la règle à une version plus robuste.

Questions connexes