¿Deshabilitar una regla de Checkstyle particular para una línea de código particular?
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.
¿Existe la posibilidad de indicarle a Checkstyle que un determinado método debe ignorarse silenciosamente?
Por cierto, terminé con mi propio contenedor de Checkstyle: qulice.com (ver Control estricto de la calidad del código Java )
Consulte el uso de supressionCommentFilter en https://checkstyle.sourceforge.io/filters/suppressioncommentfilter.html . Deberá 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 verificación (en varios niveles) y luego volver a activarlo 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 incluso mejor, usa esta versión más modificada:
<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 comprobaciones específicas para líneas de código específicas:
//CHECKSTYLE.OFF: IllegalCatch - Much more readable than catching 7 exceptions
catch (Exception e)
//CHECKSTYLE.ON: IllegalCatch
*Nota: también tendrás que agregar FileContentsHolder
:
<module name="FileContentsHolder"/>
Ver también
<module name="SuppressionFilter">
<property name="file" value="docs/suppressions.xml"/>
</module>
en la SuppressionFilter
sección de esa misma página, que le permite desactivar las comprobaciones individuales de recursos que coincidan con patrones.
Entonces, si tienes en tu checkstyle.xml:
<module name="ParameterNumber">
<property name="id" value="maxParameterNumber"/>
<property name="max" value="3"/>
<property name="tokens" value="METHOD_DEF"/>
</module>
Puedes desactivarlo en tu archivo xml de supresión con:
<suppress id="maxParameterNumber" files="YourCode.java"/>
Otro método, ahora disponible en Checkstyle 5.7, es suprimir las infracciones mediante la @SuppressWarnings
anotación de Java. Para hacer esto, necesitará agregar dos nuevos módulos ( SuppressWarningsFilter
y SuppressWarningsHolder
) en su archivo de configuración:
<module name="Checker">
...
<module name="SuppressWarningsFilter" />
<module name="TreeWalker">
...
<module name="SuppressWarningsHolder" />
</module>
</module>
Luego, dentro de tu código puedes hacer lo siguiente:
@SuppressWarnings("checkstyle:methodlength")
public void someLongMethod() throws Exception {
o, para supresiones múltiples:
@SuppressWarnings({"checkstyle:executablestatementcount", "checkstyle:methodlength"})
public void someLongMethod() throws Exception {
NB: El checkstyle:
prefijo " " es opcional (pero recomendado). Según los documentos, el nombre del parámetro debe estar en minúsculas, pero la práctica indica que cualquier caso funciona.
Si prefiere usar anotaciones para silenciar reglas selectivamente, ahora es posible usar la @SuppressWarnings
anotación, comenzando con Checkstyle 5.7 (y compatible con el complemento Checkstyle Maven 2.12+).
Primero, en su checkstyle.xml
, agregue el SuppressWarningsHolder
módulo a TreeWalker
:
<module name="TreeWalker">
<!-- Make the @SuppressWarnings annotations available to Checkstyle -->
<module name="SuppressWarningsHolder" />
</module>
A continuación, habilite SuppressWarningsFilter
allí (como hermano de TreeWalker
):
<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->
<module name="SuppressWarningsFilter" />
<module name="TreeWalker">
...
Ahora puede anotar, por ejemplo, el método que desea excluir de una determinada regla de Checkstyle:
@SuppressWarnings("checkstyle:methodlength")
@Override
public boolean equals(Object obj) {
// very long auto-generated equals() method
}
El checkstyle:
prefijo en el argumento to @SuppressWarnings
es opcional, pero me gusta como recordatorio de dónde vino esta advertencia. El nombre de la regla debe estar en minúsculas.
Por último, si está utilizando Eclipse, se quejará de que desconoce el argumento:
@SuppressWarnings no admitido("checkstyle:methodlength")
Puede desactivar esta advertencia de Eclipse en las preferencias si lo desea:
Preferences:
Java
--> Compiler
--> Errors/Warnings
--> Annotations
--> Unhandled token in '@SuppressWarnings': set to 'Ignore'
Lo que también funciona bien es 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 check FOR NEXT var LINES evite activar auditorías para la verificación dada para la línea actual y las siguientes líneas var (para un total de líneas var+1):
<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
A cada respuesta que se refiere a SuppressWarningsFilter le falta un detalle importante. Solo puede usar la identificación en minúsculas si está definida como tal en su checkstyle-config.xml. De lo contrario, debe utilizar el nombre del módulo original.
Por ejemplo, si en mi checkstyle-config.xml tengo:
<module name="NoWhitespaceBefore"/>
No puedo usar:
@SuppressWarnings({"nowhitespacebefore"})
Sin embargo, debo usar:
@SuppressWarnings({"NoWhitespaceBefore"})
Para que funcione la primera sintaxis, 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 6.17 de CheckStyle.