<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
  "https://checkstyle.org/dtds/configuration_1_3.dtd">

<!-- checker检查器,checkstyle固定配置写法,不能缺失 -->
<module name="Checker">

  <!-- 设置checkstyle以UTF8格式进行文件检查 -->
  <property name="charset" value="UTF-8"/>
  <!--定义严重程度,可选等级:ignore info warning error,如不定义默认为error -->
  <property name="severity" value="error"/>

  <!-- 检查文件的长度（行），最多2000行-->
  <module name="FileLength">
    <property name="max" value="2000"/>
  </module>

  <!--检查**.properties配置文件 是否有相同的key值 -->
  <module name="Translation">
    <property name="severity" value="error"/>
  </module>

  <!-- 检查每行字符数 -->
  <module name="LineLength">
    <property name="max" value="200"/>
  </module>

  <!-- 语法树编辑器,会根据其中定义规则,检查每个.java文件 -->
  <module name="TreeWalker">

    <!-- 检查多余的导入,如一个类导入了多次-->
    <module name="RedundantImport"/>

    <!-- 检查是否导入的包没有使用,如导入的包在类中没有被使用-->
    <module name="UnusedImports"/>

    <!-- 检查局部常量命名规范,有默认规则"^[a-z][a-zA-Z0-9]*$",可自定义" -->
    <module name="LocalFinalVariableName"/>

    <!-- 检查局部变量命名规范,有默认规则"^[a-z][a-zA-Z0-9]*$,可自定义,如for(int i=0;i<5;i++)里面的i -->
    <module name="LocalVariableName"/>

    <!-- 检查非final的静态变量,有默认规则"^[a-z][a-zA-Z0-9]*$",可自定义-->
    <module name="StaticVariableName">
      <property name="format" value="(^[A-Z0-9_]{0,19}$)"/>
    </module>

    <!-- 检查包名称命名规范,有默认规则"^[a-z]+(\.[a-z][a-z0-9]*)*$",详细解释为第一位必须为小写字母,后面位数可出现"."和小写字母/大写字母/数字 -->
    <module name="PackageName">
      <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
    </module>

    <!-- 类名命名规则 -->
    <module name="TypeName">
      <property name="format" value="(^[A-Z][a-zA-Z0-9]{0,30}$)"/>
    </module>

    <!-- 方法名命名规则 -->
    <module name="MethodName">
      <property name="format" value="(^[a-z][a-zA-Z0-9]{0,30}$)"/>
    </module>

    <!-- 实例变量/成员变量命名规则 -->
    <module name="MemberName">
      <property name="format" value="(^[a-z][a-zA-Z0-9]{0,30}$)"/>
    </module>

    <!-- 方法中的参数名命名规则 -->
    <module name="ParameterName">
      <property name="format" value="(^[a-z][a-zA-Z0-9_]{0,19}$)"/>
    </module>

    <!-- 静态常量命名规则 -->
    <module name="ConstantName">
      <property name="format" value="(^[A-Z][A-Z0-9_]{0,50}$)"/>
    </module>

    <!-- 检测代码缩进规则,默认值为4字节 -->
    <module name="Indentation">
    </module>

    <!-- 检查是否存在过度复杂的boolean返回值,例: if(b) {return true;} else {return false;}-->
    <module name="SimplifyBooleanReturn"/>

    <!-- 确保Utils类（只包含静态方法或属性(字段)的类）中没有public构造器。-->
    <module name="HideUtilityClassConstructor"/>

    <!-- 检查class成员属性可见性，只有static final 修饰的成员是可以public的，其他的成员属性必需是private的 -->
    <module name="VisibilityModifier"/>

    <!-- 检查每个变量声明是不是在其自己的语句中及自己的行上 -->
    <module name="MultipleVariableDeclarations">
    </module>

    <!-- 检查再定义数组时，采用java风格还是c风格，例如：int[] num是java风格，int num[]是c风格。默认是java风格-->
    <module name="ArrayTypeStyle">
    </module>

    <!-- 检查是否是"MagicNumber",指的是未定义的数字文本,但默认情况-1/0/1/2不视为"MagicNumber" -->
<!--    <module name="MagicNumber">-->
<!--    </module>-->

    <!-- 检查是否在long类型是否定义了大写的L.字母小写l和数字1（一）很相似 -->
    <module name="UpperEll"/>

    <!-- 检查switch语句是否有 default从句 -->
    <module name="MissingSwitchDefault"/>

    <!--检查switch中case后是否加入了跳出语句，例如：return、break、throw、continue -->
    <module name="FallThrough"/>

    <!-- 检查方法或构造函数中的参数数量-->
    <module name="ParameterNumber">
      <property name="max" value="7"/>
    </module>

    <!-- 检查方法长度，忽略空行和注释，最大上限为300 -->
    <module name="MethodLength">
      <property name="max" value="300"/>
      <property name="countEmpty" value="false"/>
    </module>

    <!-- 检查是否有多余的修饰符，例如：接口中的方法不必使用public、abstract修饰  -->
    <module name="RedundantModifier">
    </module>

    <!--- 字符串比较必须使用 equals() -->
    <module name="StringLiteralEquality">
    </module>

    <!-- if-else嵌套语句个数，最多为10层 -->
    <module name="NestedIfDepth">
      <property name="max" value="10"/>
    </module>

    <!-- try-catch 嵌套语句个数 最多3层 -->
    <module name="NestedTryDepth">
      <property name="max" value="3"/>
    </module>

  </module>

</module>