当前位置: 首页 > 大杂烩 > 正文

Java代码样式检查工具Checkstyle配置详解

Java代码样式检查工具Checkstyle配置详解

1 checkstyle简介

Checkstyle是一款检查java程序代码样式的工具,可以有效的帮助我们审查代码以便更好的遵循代码编写标准,特别适用于小组开发时彼此间的样式规范和统一。Checkstyle提供了高可配置性,以便适用于各种代码规范,所以除了可以使用它提供的sun的代码标准外,你也可以定制自己的标准。另外,可以在eclipse中安装checkstyle的插件,以方便使用。

Checkstyle可以让程序员养成书写良好代码风格的习惯,代码的整洁也减少了很多bad smell的产生。使用checkstyle的过程中可能需要经常的调整配置文件,有些check过于严格,可以根据实际情况取消一些代码检查。

2 Eclipse插件安装

Eclipse安装地址:http://eclipse-cs.sourceforge.net/update

3 Checkstyle的配置

Checkstyle配置是通过指定modules来应用到java文件的。modules是树状结构,以一个名为Checker的module作为root节点,一般的checker都会包括TreeWalker子module。我们可以参照checkstyle中的sun_checks.xml,这是根据sun的java语言规范写的配置。

在xml配置文件中通过module的name属性来区分module,module的Properties可以控制如何去执行这个module,每个property都有一个默认值,所有的check都有一个severity属性,用它来指定check的level。TreeWalker为每个java文件创建一个语法树,在节点之间调用submodules的Checks。

3.1 下面来看看standard checks中的一些具体用法。

3.1.1 Javadoc Comments

  • JavadocPackage

检查每个java package中是否有java注释文件,默认是允许一个package-info.java,也可以通过allowLegacy属性配置允许package.html。

  • JavadocType

检查类和接口的javadoc。默认不检查author和version tags。

  • JavadocMethod

检查方法和构造函数的javadoc。默认不检查未使用的异常抛出。

  • JavadocVariable

检查变量的javadoc。

  • JavadocStyle:

检查javadoc的格式。比如:javadoc的第一行是否以句号结束,javadoc除了tags外是否有description,检查javadoc中的html格式。

  • WriteTag

输出javadoc中的tag。

3.1.2 Naming Conventions

  • AbstractClassName

检查抽象类名。

  • ClassTypeParameterName

检查类的Parameter名。

  • ConstantName

检查常量名。

  • LocalFinalVariableName

检查局部的final类型变量名,包括catch的参数。

  • LocalVarableName

检查局部的非final类型的变量名,包括catch的参数。

  • MemberName

检查非静态变量。

  • MethodName

检查方法名。

  • MethodTypeParameterName

检查方法的参数名。

  • PackageName

检查包名。

  • ParameterName

检查参数名。

  • StaticVariableName

检查静态的,非final类型的变量名。

  • TypeName

检查类名和接口名。

3.1.3.Imports

  • AvoidStarImport

检查是否有使用*进行import。

  • AvoidStaticImport

检查是否有静态import。比如是否导入了java.lang包中的内容。

  • IllegalImport

检查是否import了违法的包。默认拒绝import所有sun.*包。

  • RedundanImport

检查是否有重复的import。

  • UnusedImports

检查是否有未使用的import。

  • ImportOrder

检查import的分组和顺序。

  • ImportControl

控制可import的包。在一个较大的project可限制使用过多的第三方包,通过一个依照http://www.puppycrawl.com/dtds/import_control_1_0.dtd的xml文件来指定。

3.1.4 Size Violations

  • ExecutableStatementCount

限制可执行代码片段的长度。默认为30。

  • FileLength

检查java文件的长度。默认为2000。

  • LineLength

检查代码行的长度。默认为80。

  • MethodLength

检查方法和构造函数的长度。默认为150。

  • AnonInnerLength

检查匿名内部类的长度。默认为20。

  • ParameterNumber

检查方法和构造函数的参数个数。默认为7。

3.1.5 Whitespace

  • GenericWhitespace

检查<和>周围的空白。

  • EmptyForInitializerPad

检查空的初始化位置的空白。比如for循环中的初始化。

  • EmptyForIteratorPad

检查空的迭代位置的空白。

  • MethodParamPad

检查方法签名之前的空白。

  • NoWhitespaceAfter

检查分隔符后的空白。

  • NoWhitespaceBefore

检查分隔符前的空白。

  • OperatorWrap

检查操作符的空白规则。

  • ParenPad

检查圆括号的空白规则。

  • TypecaseParenPad

检查强制转型的圆括号的空白规则。

  • TabCharacter

检查是否有Tab字符(’”t’)。

  • WhitespaceAfter

检查分隔符是否在空白之后。

  • WhitespaceAround

检查分隔符周围是否有空白。

3.1.6 ModifierOrder

  • ModifierOrder

检查修饰符的顺序是否遵照java语言规范。

  • RedundantModifier

检查接口和annotation中是否有重复的修饰符。

3.1.7 Block Checks

  • EmptyBlock

检查空的代码块。

  • LeftCurly

检查’{’和左边的代码块是否在同一行。

  • NeedBraces

检查是否需要大括号。主要是在if,else时的情况。

  • RightCurly

检查’}’。

  • AvoidNestedBlocks

检查不需要的嵌套’{}’。

3.1.8 Coding

  • ArrayTrailingComma

检查数组初始化是否以逗号结束。

  • AvoidInlineConditionals

检查inline的条件操作。

  • CovariantEquals

检查类是否覆盖了equals(java.lang.Object)。

  • DoubleCheckedLocking

检查DCL的问题。

  • EmptyStatement

检查空的代码段。

  • EqualsAvoidNull

检查一个可能为null的字符串是否在equals()比较的左边。

  • EqualsHashCode

检查类是否覆盖了equals()和hashCode()。

  • FinalLocalVariable

检查未改变过的局部变量是否声明为final。

  • HiddenField

检查局部变量或参数是否隐藏了类中的变量。

  • IllegalInstantiation

检查是否使用工厂方法实例化。

  • IllegalToken

检查非法的分隔符。

  • IllegalTokenText

检查非法的分隔符的下个字符。

  • InnerAssignment

检查子表达式中是否有赋值操作。

  • MagicNumber

检查是否有“magic numbers”。

  • MissingSwitchDefault

检查switch语句是否有default的clause。

  • ModifiedControlVariable

检查循环控制的变量是否在代码块中被修改。

  • RedundantThrows

检查是否有被重复抛出的异常。

  • SimplifyBooleanExpression

检查是否有过度复杂的布尔表达式。

  • SimplifyBooleanReturn

检查是否有过于复杂的布尔返回代码段。

  • StringLiteralEquality

检查字符串是否有用= =或!=进行操作。

  • NestedIfDepth

检查嵌套的层次深度。

  • NestedTryDepth

检查try的层次深度。

  • NoClone

检查是否覆盖了clone()。

  • NoFinalizer

检查是否有定义finalize()。

  • SuperClone

检查覆盖的clone()是否有调用super.clone()。

  • SuperFinalize

检查覆盖的finalize()是否有调用super.finalize()。

  • IllegalCatch

检查是否catch了不能接受的错误。

  • IllegalThrows

检查是否抛出了未声明的异常。

  • PackageDeclaration

检查类中是否有声明package。

  • JUnitTestCase

确保setUp(), tearDown()方法签名的正确性。

  • ReturnCount

限制return代码段的数量。

  • IllegalType

检查未使用过的类。

  • DeclarationOrder

检查类和接口中的声明顺序。

  • ParameterAssignment

检查不允许的参数赋值。

  • ExplicitInitialization

检查类和对象成员是否初始化为默认值。

  • DefaultComesLast

检查default的clause是否在switch代码段的最后。

  • MissingCtor

检查类依赖。

  • FallThrough

检查switch代码的case中是否缺少break,return,throw和continue。

  • MultipleStringLiterals

检查一个文件中是否有多次出现的字符串。

  • MultipleVariableDeclarations

检查代码段和代码行中是否有多次变量声明。

  • RequireThis

检查代码中是否有“this.”。

  • UnnecessaryParentheses

检查是否有使用不需要的圆括号。

4.1.9 Class Design

  • VisibilityModifier

检查类成员的可见度。

  • FinalClass

检查只有private构造函数的类是否声明为final。

  • InterfaceIsType

检查接口是否仅定义类型。

  • HideUtilityClassConstructor

检查工具类是否有putblic的构造器。

  • DesignForExension

检查类是否为扩展设计。

  • MutableException

确保异常是不可变的。

  • ThrowsCount

限制抛出异常的数量。

4.1.10 Duplicate Code

  • StrictDuplicateCode

严格检查重复代码。

4.1.11 Miscellaneous

  • GenericIllegalRegexp

正则表达式的模式检查。

  • NewlineAtEndOfFile

检查文件是否以一个空行结束。

  • TodoComment

检查TODO:注释。

  • Translation

检查property文件中是否有相同的key。

  • UncommentedMain

检查是否有未注释的main方法。

  • UpperEll

检查long型约束是否有大写的“L”。

  • ArrayTypeStyle

检查数组类型定义的样式。

  • FinalParameters

检查方法名、构造函数、catch块的参数是否是final的。

  • Indentation

检查代码中正确的缩进。

  • TrailingComment

确保是否要代码行注释。

  • RequiredRegexp

确保一个指定的正则表达式的规则已经存在代码中。

3.2 Checkstyle常见的错误提示

  1. Type is missing a javadoc commentClass 缺少类型说明
  2. “{” should be on the previous line“{” 应该位于前一行。解决方法:把“{”放到上一行去
  3. Methos is missing a javadoc comment 方法前面缺少javadoc注释。解决方法:添加javadoc注释 类似这样:

    /**

    • set default mock parameter.(方法说明)
    • @param additionalParameters parameter additional(参数名称)
    • @return data manager(返回值说明)
    • @throws Exception if has error(异常说明)
      */
  4. Expected @throws tag for “Exception”在注释中希望有@throws的说明:
    解决方法:在方法前得注释中添加这样一行:* @throws Exception if has error(异常说明)

  5. “.” Is preceeded with whitespace “.” 前面不能有空格。解决方法:把“(”前面的空格去掉
  6. “.” Is followed by whitespace“.” 后面不能有空格。解决方法:把“)”后面的空格去掉
  7. “=” is not preceeded with whitespace“=” 前面缺少空格。解决方法:在“=”前面加个空格
  8. “=” is not followed with whitespace“=” 后面缺少空格。解决方法:在“=”后面加个空格
  9. “}” should be on the same line“}” 应该与下条语句位于同一行。解决方法:把“}”放到下一行的前面
  10. Unused @param tag for “unused”没有参数“unused”,不需注释
    解决方法:“* @param unused parameter additional(参数名称)” 把这行unused参数的注释去掉“
  11. Variable “CA” missing javadoc变量“CA”缺少javadoc注释
    解决方法:在“CA“变量前添加javadoc注释:/** CA. */(注意:一定记得加上“.”)
  12. Line longer than 80characters行长度超过80 。解决方法:把它分成多行写。必要时候,可以ctrl+shift+f
  13. Line contains a tab character行含有”tab” 字符。快速解决方法:可以使用editplus中的format功能,把tab字符转化为空格,然后保存Editplus英文版安装文件在我机子上有。需要的可以来拷贝。注册Editplus,点击安装文件中注册的文件
  14. Redundant “Public” modifier冗余的“public” modifier 。解决方法:冗余的“public”
  15. Final modifier out of order with the JSL suggestion Final modifier的顺序错误
  16. Avoid using the “.” form of importImport格式避免使用“.
  17. Redundant import from the same package从同一个包中Import内容
  18. Unused import-java.util.listImport进来的java.util.list没有被使用。解决方法:去掉导入的多余的类
  19. Duplicate import to line 13重复Import同一个内容 解决方法:去掉导入的多余的类
  20. Import from illegal package从非法包中 Import内容
  21. “while” construct must use “{}” “while” 语句缺少“{}”
  22. Variable “sTest1” must be private and have accessor method变量“sTest1”应该是private的,并且有调用它的方法
  23. Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]$”变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]$”解决方法:把这个命名改成符合规则的命名 “aBC”
  24. “(” is followed by whitespace“(” 后面不能有空格 25“)”is proceeded by whitespace“)” 前面不能有空格
    解决方法:把前面或者后面的空格去掉
  25. First sentence should end with a period.解决方法:你的注释的第一行文字结束应该加上一个”.”。
  26. Redundant throws: ‘NameNotFoundException’ is subclass of ‘NamingException’. ‘NameNotFoundException ‘是’NamingException’的子类重复抛出异常。
    解决方法:如果抛出两个异常,一个异常类是另一个的子类,那么只需要写父类
    去掉NameNotFoundException异常,对应的javadoc注释异常注释说明也需要去掉
  27. Parameter docType should be final. 参数docType应该为final类型 解决方法:在参数docType前面加个final
  28. Line has trailing spaces. 多余的空行 解决方法:去掉这行空行
  29. Must have at least one statement. 至少一个声明
    解决方法:} catch (NumberFormatException nfe) {
    LOG.error(“Auto Renews the agreement failed”, nfe);//异常捕捉里面不能为空,在异常里面加一句话。如打印等等
  30. ‘>’ is not followed by whitespace.并且又有 ‘(‘ is preceded with whitespace.
    定义集合和枚举的时候的时候,最后一个“>”后面要有空格,“(”前面不容许有空格。解决方法:去掉泛型
  31. Got an exception – java.lang.RuntimeException: Unable to get class information for @throws tag ‘SystemException’.原因:不合理的throws。
    解决方法:要确保某些类型,如某些类、接口不被throws。把声明的异常去掉。在实现类中抛出异常
    网上参考解决方法:

    1. 这是CheckStyle报的错。通常需要Refreh, clean/build这个Project. 如果不行,可以尝试clean all projects, restart Eclipse.
    2. 因为编译好的类没有在checkstyle的classpath中.所以, 只要将编译好的class配置到在的classpath中就没有这个问题了.另外, 还发现checkstyle的line length好像也有点问题, 明明没有超过120个字符, 却还是报错.无奈, 我把Eclipse中java > code style > formatter中的Maximum line with改成了100, 然后format一下, 基本就没有问题了
  32. File does not end with a newline.解决方法:删掉报错的类,新建一个同名的类,把代码全部复制过去
  33. Utility classes should not have a public or default constructor. 接口中的内部类中不应该有公共的或者默认的构造方法
    解决方法:在内部类中,定义一个私有的构造方法,然后内部类声明为final类型。如果前面有static,那么final还必须放在static之后
  34. Variable ‘functionCode’ must be private and have accessor methods.变量要改成private然后提供访问的方法
    解决方法:给这些变量的修饰符改成private,然后提供set,get方法,并加上对应的方法javadoc注释、参数注释。并在返回值和参数类型前添加final。并把调用了这个变量的地方改成通过方法访问
  35. ‘X’ hides a field.
    >public class Foo
    >{
    > private int bar;
    >
    > public Foo(int bar)
    > {
    > this.bar = bar;
    > }
    >
    > public final int getBar()
    > {
    > return bar;
    > }
    >}
    全局private int bar;和局部public Foo(int bar)的bar变量名字重复。
    解决方法:把方法里面的参数名称改变下就可以了public Foo(int newBar)
    >{
    > this.bar = newBar;
    >}
  36. Got an exception – Unexpected character 0xfffd in identifier
    这是因为CheckStyle不能识别制定的编码格式。
    网上参考解决方法:

    1. Eclipse中可以配置,在Other–>checker中可以指定
    2. 可以修改checkstyle配置文件:
&lt;module name=&quot;Checker&quot;&gt;
&lt;property name=&quot;severity&quot; value=&quot;warning&quot;/&gt;
&lt;property name=&quot;charset&quot; value=&quot;UTF-8&quot;/&gt;
&lt;module name=&quot;TreeWalker&quot;&gt;

如果是UTF-8的话,就添加加粗斜体的那条语句,就可以了。
37. Got an exception – java.lang.RuntimeException: Unable to get class information for @throws tag whatever.
网上参考解决方法:选中CheckSytle的JavaDoc –> Method JavaDoc –> logLoadErrors。如果是CheckStyle自己加载时出错的,打个Log就可以了,不要整出Errors吓人。
还有一处也可能包出同样的错误。Coding Problems –> Redundant Throws –> logLoadErrors选中即可
38. Expected @param tag for ‘dataManager’. 缺少dataManager参数的注释 解决方法:在注释中添加@param dataManager DataManager
网上一些其他错误的解答:
– Parameter X should be final.

public class Foo
{
   private int bar;

   public Foo(int bar)
   {
       this.bar = bar;
   }

   public final int getBar()
   {
       return bar;
   }
}

解释:public Foo(int bar)的局部变量,被认为是不可改变的,检查需要加上final关键字定义public Foo(final int bar)此错误,可以忽略不检查。
– Redundant ‘X’ modifier.

public interface CacheHRTreeService extends Manager {
/**
 * Organization Tree
 * @param orgDto
 * @return
 * @throws Exception
 */
public void setOrganization(OrganizationDTO orgDto) throws Exception;
/**
 * Organization Tree
 * @return
 * @throws Exception
 */
public OrganizationDTO getOrganization() throws Exception;
......
}

解释:多余的字段。public OrganizationDTO getOrganization() throws Exception;此时public为多余的字段,因为interface定义的时候,就是public的。需要检查。
– Class X should be declared as final.
解释:对于单例设计模式,要求返回唯一的类对象。但是HRFactory和ContextFactory为优化的两个类,不需求检查。
其他的单例类,依然需要进行检查。
– Method ‘addChildrenId’ is not designed for extension – needs to be abstract, final or empty.
解释:通过父类继承的,此类有点特殊可以忽略此类。
– Variable ‘id’ must be private and have accessor methods.解释:BaseHRDTO类,为父类,属性给子类继承,比较特殊。但是其他的类,声名需要加上范围’private’关键字。需要检查。
– Array brackets at illegal position.解释:代码写法,习惯不一样。需要检查,仅仅提示

本文固定链接: http://sdnhub.cn/index.php/java-checkstyle/ | 软件定义网络SDN

该日志由 sdnhub 于2015年03月28日发表在 大杂烩 分类下, 通告目前不可用,你可以至底部留下评论。
原创文章转载请注明: Java代码样式检查工具Checkstyle配置详解 | 软件定义网络SDN
关键字:

Java代码样式检查工具Checkstyle配置详解:等您坐沙发呢!

发表评论

*

快捷键:Ctrl+Enter