YoShallnotPass es el analizador estático para su código elegante.
Solo mira, lo que puede encontrar en un código aparentemente habitual:
package com . example ;
import java . util . Collection ;
import java . util . StringTokenizer ;
public class Words {
public static final String DELIM = " ,." ;
private Collection < String > words ;
public Words () {
this . words = null ;
}
public Words ( Collection < String > words ) {
this . words = words ;
}
boolean containsIn ( String text ) {
if ( words == null ) return false ;
StringTokenizer tokenizer = new StringTokenizer ( text , DELIM );
while ( tokenizer . hasMoreTokens ()) {
String nextWord = tokenizer . nextToken ();
if ( words . contains ( nextWord )) return true ;
}
return false ;
}
}Las violaciones del análisis de YouShallnotPass :
nullfree
com.example.Words(Words.java:12) > null
com.example.Words.containsIn(Words.java:20) > null
staticfree
com.example.A.main(A.java:6) > static
com.example.Words(Words.java:7) > static
allfinal
com.example.A.main(A.java:6) > String[] args
com.example.A(A.java:5) > A
com.example.Words(Words.java:9) > words
com.example.Words.containsIn(Words.java:22) > StringTokenizer tokenizer = new StringTokenizer(text, DELIM)
com.example.Words.containsIn(Words.java:24) > String nextWord = tokenizer.nextToken()
com.example.Words(Words.java:15) > Collection<String> words
com.example.Words.containsIn(Words.java:19) > String text
com.example.Words(Words.java:6) > Words
allpublic
com.example.Words.containsIn(Words.java:19)
nomultiplereturn
com.example.Words.containsIn(Words.java:19)
Agregue el complemento a la build.gradle de raíz.
plugins {
id ' dev.youshallnotpass ' version ' x.y.z '
}
// then configure it, if you need:
youshallnotpass {
offline = true // default false
nullfree {
disabled = true // default false
threshold = 3 // default 0
skipComparisons = true // default false
}
staticfree {
disabled = true // default false
threshold = 2 // default 0
}
allfinal {
disabled = true // default false
threshold = 1 // default 0
skipInterfaceMethodParams = false // default true
skipLambdaParams = true // default false
skipCatchParams = true // default false
}
allpublic {
disabled = true // default false
threshold = 4 // default 0
}
setterfree {
disabled = true // default false
threshold = 5 // default 0
}
nomultiplereturn {
disabled = true // default false
threshold = 6 // default 0
}
inheritancefree {
disabled = true // default false
threshold = 7 // default 0
}
} Donde xyz es la versión real de Gradle Plugins
Invocarlo:
./gradlew youshallnotpass Agregue el complemento al pom.xml
< plugin >
< groupId >dev.youshallnotpass</ groupId >
< artifactId >youshallnotpass-maven-plugin</ artifactId >
< version >x.y.z</ version >
<!-- then configure it, if you need: -->
< configuration >
< offline >true</ offline > <!-- default false -->
< nullfree >
< disabled >true</ disabled > <!-- default false -->
< threshold >3</ threshold > <!-- default 0 -->
< skipComparisons >true</ skipComparisons > <!-- default false -->
</ nullfree >
< staticfree >
< disabled >true</ disabled > <!-- default false -->
< threshold >2</ threshold > <!-- default 0 -->
</ staticfree >
< allfinal >
< disabled >true</ disabled > <!-- default false -->
< threshold >1</ threshold > <!-- default 0 -->
< skipInterfaceMethodParams >false</ skipInterfaceMethodParams > <!-- default true -->
< skipLambdaParams >true</ skipLambdaParams > <!-- default false -->
< skipCatchParams >true</ skipCatchParams > <!-- default false -->
</ allfinal >
< allpublic >
< disabled >true</ disabled > <!-- default false -->
< threshold >4</ threshold > <!-- default 0 -->
</ allpublic >
< setterfree >
< disabled >true</ disabled > <!-- default false -->
< threshold >5</ threshold > <!-- default 0 -->
</ setterfree >
< nomultiplereturn >
< disabled >true</ disabled > <!-- default false -->
< threshold >6</ threshold > <!-- default 0 -->
</ nomultiplereturn >
< inheritancefree >
< disabled >true</ disabled > <!-- default false -->
< threshold >7</ threshold > <!-- default 0 -->
</ inheritancefree >
</ configuration >
</ plugin >Invocarlo:
mvn youshallnotpass:youshallnotpass Donde xyz es la versión real de Maven Central
✅ NullFree (¿Por qué null es malo?) El código elegante no debe usar las palabras clave null
✅ El código elegante no debe usar las palabras clave static static
✅ Allfinal Cada clase, cada campo, cada argumento, cada variable local debe ser final en el código elegante
instanceOffree [in progress] El código elegante no debe usar la instanceof las palabras clave
✅ El código elegante libre de herencia no debe usar la herencia de clase (cuando una clase extends otra), solo se ha permitido la composición y la herencia de tipo
enumfree [in progress] El código elegante no debe usar el enum s
SwitchFree [in progress] El código elegante no debe usar los bloques/expresiones switch
✅ El código elegante de NomultiPlEnTurn debe contener solo una (o nadie) devolver en cualquier método
GetterFree [in progress] El código elegante no debe contener ningún getter
✅ El código elegante de SetterFree no debe contener ningún setter
✅ El código elegante AllPublic debe usar solo métodos public
nopublicMethodNotOverrides [in progress] Cada método público en el código elegante debe ser anulado de una interfaz
Opciones de configuración del complemento:
skipComparisons permite usar null en expresiones booleanas: if ( some == null ) {
...
} Puede ser suprimido en el código por @SuppressWarnings("nullfree")
Puede ser suprimido en el código por @SuppressWarnings("staticfree")
Opciones de configuración del complemento:
skipInterfaceMethodParams permite restringir o no el parámetro del método de interfaz final S, de forma predeterminada, no es necesario establecer final para tales lugaresskipLambdaParams permite que Skip final en los parámetros Lambda, de manera predeterminada, el parámetro Lambda debe ser finalskipCatchParams permite omitir final en los parámetros catch , de forma predeterminada, el parámetro catch debe ser final Puede ser suprimido en el código por @SuppressWarnings("allfinal")
Puede ser suprimido en el código por @SuppressWarnings("allpublic")
Puede ser suprimido en el código por @SuppressWarnings("setterfree")
Puede ser suprimido en el código por @SuppressWarnings("nomultiplereturn")
Puede ser suprimido en el código por @SuppressWarnings("inheritancefree")
Si usa el complemento YouShallNotPass sin configuración offline = true , puede adjuntar las inspecciones en su archivo ReadMe:
 Cualquier inspección se puede configurar con threshold :
En gradle
youshallnotpass {
.. .
staticfree {
threshold = 19
}
.. .
} En maven
< configuration >
< staticfree >
< threshold >19</ threshold >
</ staticfree >
</ configuration > Cualquier inspección puede deshabilitarse mediante configuración disabled :
En gradle
youshallnotpass {
.. .
staticfree {
disabled = true
}
.. .
} En maven
< configuration >
< staticfree >
< disabled >true</ disabled >
</ staticfree >
</ configuration >Todas las inspecciones están habilitadas de forma predeterminada.
Existe la configuración exclude global, que se pueden usar para definir los patrones de exclusión: en gradle
youshallnotpass {
exclude = [ " glob:**/test/**/*Test.java " ]
} En maven
< configuration >
< exclude >glob:**/test/**/*Test.java</ exclude >
</ configuration >Existe la opción de configuración de exclusión local de Inspection, que tiene mayor prioridad que la configuración de exclusión global: la configuración:
En gradle
nullfree {
exclude = [ " glob:**/*SomeBadFile.java " ]
} En maven
< nullfree >
< exclude >glob:**/*SomeBadFile.java</ exclude >
</ nullfree >MIT