Domanda

Voglio una regola che controlli che i campi e le classi siano correttamente annotati con la concorrenza java nelle annotazioni di pratica fornita da: http://mvnrepository.com/artifact/net.jcip/jcip-annotations

I campi devono essere annotato con @GuardedBy e le classi devono essere annotato con una delle @Immutable, @ThreadSafe o @NotThreadSafe.

Ho una regola attualmente applicata, che assicura che le classi Spring Dao sono annotati con @Repository anziché @Service o @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>

Il problema di questo approccio è che posso controllare solo per alcune annotazioni e dire, che l'altra annotazione dovrebbe meglio essere usato al posto. Questo non mi aiuta con il controllo jcip annotazione, perché non posso controllare "senza specifica annotazione presente".

Per cominciare, che sarebbe stato bello se qualcuno sapeva come trasformare il controllo di Dao sopra in un controllo che solo assicura, che @Repository è presente su classi che nomi terminano con Dao. Questo modello potrebbe quindi essere utilizzato per sviluppare i controlli jcip annotazione.

O forse, invece di cercare di trasformare il controllo di espressione regolare, forse c'è qualche modo per attuare le norme jcip con il supporto segno di checkstyle? Ciò magari fare la regola robusta.

In ogni caso, vorrei sapere come garantire che una specifica annotazione deve essere presente su un elemento specifico tramite checkstyle. Speriamo che qualcuno lo sa. :)

È stato utile?

Soluzione

Trovato la soluzione:

<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>

Inoltre, controllando per @GuardedBy non ha alcun senso, perché dipende dalla strategia di sincronizzazione gli usi di classe. Così non è sempre necessario aggiungere @GuardedBy alla dichiarazione campo. E il controllo per i casi in cui è necessario è del tutto troppo complesso per una semplice regola checkstyle. :)

EDIT:. Solo per coerenza, Ho aggiornato la regola a una versione più robusta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top