2010-10-26 14 views
134

Tengo una regla de validación checkstyle configurada en mi proyecto, que prohíbe definir métodos de clase con más de 3 parámetros de entrada. La regla funciona bien para mis clases, pero a veces tengo que extender clases de terceros, que no obedecen esta regla en particular.¿Cómo deshabilitar una regla de estilo de control particular para una línea de código en particular?

¿Existe la posibilidad de indicar "checkstyle" que un determinado método se debe ignorar silenciosamente?

Por cierto, terminé con mi propio envoltorio de Checkstyle: qulice.com (ver Strict Control of Java Code Quality)

Respuesta

211

Mira la utilización de la supressionCommentFilter en http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter. Necesitará agregar el módulo a su checkstyle.xml

<module name="SuppressionCommentFilter"/> 

y es configurable. Por lo tanto, puede agregar comentarios a su código para desactivar el estilo de control (en varios niveles) y luego volver a encenderlo mediante el uso de comentarios en su código. P.ej.

//CHECKSTYLE:OFF 
public void someMethod(String arg1, String arg2, String arg3, String arg4) { 
//CHECKSTYLE:ON 

O mejor aún, utilizar esta versión más retocada:

<module name="SuppressionCommentFilter"> 
    <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/> 
    <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/> 
    <property name="checkFormat" value="$1"/> 
</module> 

que le permite desactivar los controles específicos para las líneas específicas de código:

//CHECKSTYLE.OFF: IllegalCatch - Much more readable than catching 7 exceptions 
catch (Exception e) 
//CHECKSTYLE.ON: IllegalCatch 

Véase también

<module name="SuppressionFilter"> 
    <property name="file" value="docs/suppressions.xml"/> 
</module> 

debajo del Sección SuppressionFilter en la misma página, que le permite desactivar las comprobaciones individuales de los recursos de patrones combinados.

lo tanto, si usted tiene en su checkstyle.xml:

<module name="ParameterNumber"> 
    <property name="id" value="maxParameterNumber"/> 
    <property name="max" value="3"/> 
    <property name="tokens" value="METHOD_DEF"/> 
</module> 

Usted puede apagarlo en el archivo XML con la supresión:

<suppress id="maxParameterNumber" files="YourCode.java"/> 

Otro método, ahora disponible en Checkstyle 5.7 es para suprimir violaciones a través de la anotación Java @SuppressWarnigns. Para ello, tendrá que nuevos módulos (SuppressWarningsFilter y SuppressWarningsHolder) en el archivo de configuración:

<module name="Checker"> 
    ... 
    <module name="SuppressWarningsFilter" /> 
    <module name="TreeWalker"> 
     ... 
     <module name="SuppressWarningsHolder" /> 
    </module> 
</module> 

Luego, dentro de su código, puede hacer lo siguiente:

@SuppressWarnings("checkstyle:methodlength") 
public void someLongMethod() throws Exception { 

o, para múltiples supresiones :

@SuppressWarnings({"checkstyle:executablestatementcount", "checkstyle:methodlength"}) 
public void someLongMethod() throws Exception { 

NB: el "checkstyle:" prefijo es opcional (pero recomendado) y el parámetro de nombre tiene que estar en minúsculas.

+5

recuerde agregar FileContentsHolder en el TreeWalter . Ver http://stackoverflow.com/a/5764666/480483 – djjeck

+1

si usa '//CHECKSTYLE.OFF:' y luego olvida volver a activarlo, solo se marcará en el archivo que contenga '// CHECKSTYLE. OFF: '¿o todos los archivos procesados ​​posteriormente también? – Roland

+0

@Roland, permanece desactivado solo durante la clase de prueba. –

28

Lo que también funciona bien es el SuppressWithNearbyCommentFilter que utiliza comentarios individuales para suprimir eventos de auditoría.

Por ejemplo

// CHECKSTYLE IGNORE check FOR NEXT 1 LINES 
public void onClick(View view) { ... } 

Para configurar un filtro para que Checkstyle IGNORE cheque por LÍNEAS var SIGUIENTE evita la activación cualquiera de las auditorías para la comprobación dado para la línea actual y las siguientes líneas Var (para un total de var + 1 líneas):

<module name="SuppressWithNearbyCommentFilter"> 
    <property name="commentFormat" value="CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES"/> 
    <property name="checkFormat" value="$1"/> 
    <property name="influenceFormat" value="$2"/> 
</module> 

http://checkstyle.sourceforge.net/config.html

+0

Cambiaría la expresión regular a 'CHECKSTYLE IGNORE (\ w +) FOR NEXT (\ d +) LINES?' Que hará que el comando de ignorar sea más legible. (Podrá usar "CHECKSTYLE IGNORE check FOR NEXT 1 LINE" y "CHECKSTYLE IGNORE check for NEXT 3 LINES"). – Matt3o12

+0

@ matt3o12 'CHECKSTYLE IGNORE (\ w +) PARA NEXT (\ d +) LINE' también funciona para mí (coincide tanto con' line' como 'lines'). –

45

Si prefiere utilizar las anotaciones para silenciar selectivamente reglas, esto es ahora posible con el @SuppressWarnings anotación, comenzando con Checkstyle 5.7 (y compatible con Checkstyle Maven Plugin 2.12+).

En primer lugar, en su checkstyle.xml, agregar el módulo SuppressWarningsHolder a la TreeWalker:

<module name="TreeWalker"> 
    <!-- Make the @SuppressWarnings annotations available to Checkstyle --> 
    <module name="SuppressWarningsHolder" /> 
</module> 

continuación, habilite la SuppressWarningsFilter allí:

<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation --> 
<module name="SuppressWarningsFilter" /> 

Ahora puede anotar por ejemplo, el método que desea excluir de una cierta regla Checkstyle:

@SuppressWarnings("checkstyle:methodlength") 
@Override 
public boolean equals(Object obj) { 
    // very long auto-generated equals() method 
} 

El checkstyle: prefijo en el argumento de @SuppressWarnings es opcional, pero me gusta como un recordatorio donde esta advertencia vino.

Por último, si estás usando Eclipse, que se quejan de ser desconocido el argumento de que:

@SuppressWarnings no compatibles ("Checkstyle: methodlength")

Puede desactivar esta Eclipse de advertencia en las preferencias si te gusta:

Preferences: 
    Java 
    --> Compiler 
    --> Errors/Warnings 
    --> Annotations 
    --> Unhandled token in '@SuppressWarnings': set to 'Ignore' 
1

Cada respuesta refiriéndose a SuppressWarningsFilter le falta un det importante afligir. Solo puede usar la Id. En minúsculas si está definida como tal en su checkstyle-config.xml. Si no, debes usar el nombre del módulo original.

Por ejemplo, si en mi Checkstyle-config.xml tengo:

<module name="NoWhitespaceBefore"/> 

no puedo usar:

@SuppressWarnings({"nowhitespacebefore"}) 

Debo, sin embargo, su uso:

@SuppressWarnings({"NoWhitespaceBefore"}) 

Para que la primera sintaxis funcione, checkstyle-config.xml debe tener:

<module name="NoWhitespaceBefore"> 
    <property name="id" value="nowhitespacebefore"/> 
</module> 

Esto es lo que funcionó para mí, al menos en la versión CheckStyle 6.17.

1

Tuve dificultades con las respuestas anteriores, posiblemente porque establecí las advertencias checkStyle como errores.Lo que funcionó fue SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

El inconveniente de esto es que el rango de línea se almacena en un archivo suppresssions.xml por separado, por lo que un desarrollador desconocido puede no hacer la conexión inmediatamente.

+0

Gracias, fue lo único que funcionó para mí también – jonathanrz

1
<module name="Checker"> 
    <module name="SuppressionCommentFilter"/> 
    <module name="TreeWalker"> 
     <module name="FileContentsHolder"/> 
    </module> 
</module> 

Para configurar un filtro para suprimir los eventos de auditoría entre un comentario que contiene la línea COMENZAR código generado y un comentario que contiene FIN línea de código generado:

<module name="SuppressionCommentFilter"> 
    <property name="offCommentFormat" value="BEGIN GENERATED CODE"/> 
    <property name="onCommentFormat" value="END GENERATED CODE"/> 
</module> 

//BEGIN GENERATED CODE 
@Override 
public boolean equals(Object obj) { ... } // No violation events will be reported 

@Override 
public int hashCode() { ... } // No violation events will be reported 
//END GENERATED CODE 

See more

+0

esto solo omite la alerta pero los problemas aún aparecen en la auditoría ... – viruskimera

Cuestiones relacionadas