自己收集的一些Checkstyle/PMD/Findbugs编码规范,或许对大家有点用
1、 检查使用*号的导入,默认为全部类。
2、 检查多余的导入,如一个类导入了多次。
3、 检查没有使用的导入。
4、 检查是否有非法的包,缺省检查sun.*;对于某些包是不建议直接调用的。
5、 不需要在相同包中导入一个类。
6、 文件的最大行数,缺省为1500。
7、 每行的最大字符数,缺省为80。
8、 方法的最大行数,缺省为150。
9、 匿名类的最大行数,缺省为20。
10、 检查方法参数的最大个数,缺省为7。
11、 检查正确的缩进,不要使用tab键,并建议在提交代码前Format一下。
12、 类名应该以大写字母开头。
13、 方法名最好以小写字母开头。
14、 方法名中不要包含下划线。
15、 软件包的名称不要包含大写字符。
16、 避免过短的变量名。
17、 常量最好由大写与下划线组成。
18、 去掉或者注释掉无用的变量。
19、 抽象类命名为应该为 'AbstractXXX'。
20、 避免没有一个抽象方法的抽象类
21、 在代码中多次出现的字符串最好定义为常量。
22、 避免使用“final”局部变量,将它变成类变量。
23、 避免在循环语句中初始化新对象(new变量)。
24、 确保资源(像连接、声明和记录集) 在使用后总是关闭。
25、 避免“if (x != y) ..; else ..”表达。
26、 大量软件包的导入表明在对象中高度耦合,可以考虑重构。
27、 过长参数列可以表明应该创建一个新的对象来封装众多的参数。从根本上来说,尝试对参数进行集合。
28、 一个没有附带break声明的switch语句可能有缺陷。
29、 有太多类变量的类应被重新设计为含有少量的类变量,可能通过嵌套对象对信息归类 。
30、 重写equals方法的类也需要同时重写hashcode方法。
31、 双重IF语句可以通过&&来结合条件表达式。
32、 语句中if/finally/catch等块内容不可为空。
33、 避免抛出空指针异常。
34、 对于if/else/for等花括号应当另取一行。
35、 对于/**注释信息*/应该写为:/** 注释信息 */。
36、 文件末尾需要一个空行。
37、 每个包下提供一个package.html文件。
38、 一个少于3个分支的switch语句是低效率的,应使用if语句。
39、 返回参数为数组的不能直接返回null,应该返回空数组。
40、 在使用调用创建删除文件方法时,需要处理下返回结果。
41、 集合判断空与非空使用list.isEmpty() 代替 list.size()==0。
42、 StringBuffer在append单个字符时,使用单引号如sb.append(‘:’)。
43、 避免在循环结构中出现较复杂的逻辑,对循环体内容进行方法封装。
44、 通过提取公共方法来去除重复代码。
45、 类实现了Cloneable但没有定义或使用clone方法。
46、 Random对象应一次创建多次使用
47、 clone方法没有调用super.clone()。
48、 字符串比较使用equals代替==与!=。
49、 如果类定义了compareTo()但从java.lang.Object继承了equals(),如果equals方法返回true,则compareTo必须返回0;否则会发生不可预知的错误;即如下表达式必须成立:(x.compareTo(y)==0) == (x.equals(y))。
50、 Array不要调用了toString方法。
51、 在exception路径中,要关闭数据库资源。
52、 IO stream创建后没有在exception路径中close。
53、 方法名或包中其他参数仅有大小写的区别。
54、 序列化类的非临时性字段有非序列化的值。
55、 serialVersionUID字段应该是final的。
56、 serialVersionUID字段类型应该是long。
57、 serialVersionUID字段应该是static的。
58、 类是序列化的,但没有定义serialVersionUID字段。
59、 序列化类的父类没有定义无参的constructor。
60、 equals()比较不相关的类和接口。
61、 比较byte和超出-128到127范围的数字。
62、 类定义了equal(Object),但没有重载java.lang.Object的该方法。
63、 类定义了hashcode(),但没有重载java.lang.Object的该方法。
64、 检查一个不可能为null的值是否为null。
65、 字段重复赋值,例如:x = x = 17。
66、 无意义的计算方法,相同的字段进行计算(例:x&x or x-x)。
67、 匿名类定义了没有调用或重载的方法。
68、 加锁时方法调用Thread.sleep();建议使用wait()。
69、 日历对多线程使用是不安全的。
70、 装箱的原始类型值创建后立即转换为其他的原始类型(new Double(d).intValue()),建议直接使用(int) d这样的形式。
71、 装箱的原始类型创建仅为了调用 toString()。直接调用原始类型的toString方法。例如:new Integer(1).toString() 换为:Integer.toString(1)。
72、 直接使用Double.valueOf(double),而不是new Double(double)。
73、 不建议使用new String(String),直接适应String即可。
74、 字符串和空字符串比较,建议使用 String.length() == 0而不是String.equals("")
75、 字符串调用.toString() 是多余操作。
76、 在循环中字符串拼接使用StringBuffer而不是直接用字符串的+
77、 使用map的entrySet迭代器而不是keySet。
78、 Switch、if语句的几个分支完全相同。
79、 比较两个浮点数。因为浮点数计算可能会导致溢出,考虑使用固定精度例: BigDecimal。
80、 无用的整数比较,因为总是返回相同的值(例:x <= Integer.MAX_VALUE)。
81、 重复判断对象是否不空(前面已知肯定不空)。
82、 类实现了和父类相同的接口。