1.代码布局规则
2.代码书写规则
3.命名规则
4.声明规则
5.表达式和语法规则
6.注释规则
7.回收站的初始化和规则
8.异常处理规则
9.线程和同步规则
10.面向对象设计规则
11.开发EJB规则
12.其他杂项规则
内容包括:JAVA代码标准规则,按约定的设计规则开发EJB规则、代码书写格式规则、垃圾回收规则、全局静态分析规则、初始化规则、代码国际化规则、JAVA文档注释规则、类别统计信息规则、其他杂项规则、命名协议规则、面向对象设计规则、代码优化规则、潜在规则Bugs规则、相关线程规则、不习惯规则。对于明显的规则,没有列举例子。
本规范中使用的术语说明如下:
编程时必须遵守的规则是Jtest执行java项目测试的依据。
编程时必须考虑的原则JTest不要在测试过程中强行检查。
对相应规则的必要解释
修改后的规则或建议的例子
规则或建议给出的反面例子
按规定分为1、2、3、4、5级。分别定义为:
1:可能导致功能问题,无例外。
2:可能会导致功能问题和例外。
3:不会引起功能问题。
4.代码格式问题。
5:建议。
1 1 代码布局规则
每一个Java源文件都包括一个公共的类或接口。当私有类或接口与公共类相关联的时候,通常可以将其与公共类放在同一个源文件当中。公共类应是文件中的第一个类或接口。
代码顺序如下:
采用 /**
*
*
*/ 型注释。
变量的顺序是,首先是公共变量,然后是package可见的变量,然后是protected变量。
【规则1_1】 源代码文件(.java)布局顺序如下:包,import句子、源文件注释、类别。 |
package com.zte;
import java.awt.peer.CanvasPeer;
import java.io.*;
import com.zte.ums.uep.*;
/**
* <p>文件名称: 题目名称</p>
* <p>文件描述: 本类描述</p>
* <p>版权所有: 版权所有(C)2001-2004</p>
* <p>公 司: *******</p>
* <p>内容摘要: // 本文件的内容简要描述,包括主要模块、函数及其功能的描述</p>
* <p>其他说明: // 其明其他内容</p>
* <p>完成日期:// 2000年2月25日,输入完成日期</p>
* <p>修改记录1: // 修改历史记录,包括修改日期、修改者和修改内容</p>
* <pre>
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
* </pre>
* <p>修改记录2:…</p>
* @version 1.0
* @author 作者姓名
*/
暂不需要
3
【规则1_2】 在一个类别中,布局顺序是:非私有变量、构造器、方法、内部类、私有变量main方法。 |
暂不需要
3
【规则1_3】 类中非私有变量的布局顺序如下:public、package、protected。 |
暂不需要
3
【规则1_4】 当构造器多时,应根据参数少的原则编写代码,以提高代码的可读性。 |
待定。
3
【规则1_5】 类中方法的布局顺序如下:public、package、protected、private。 |
暂不需要
3
【规则1_6】 假如有类声明main方法,把它放在类的最后。 |
保存路径: 内嵌
目录 Rules-Built-in Rules-Coding Conventions(CODSTA)
4
【建议】 函数重载应集中在一起,以提高代码可读性。 |
public class OGM {
void foo () {}
void bar () {}
void bab () {}
void foo (int a) { //违例
}
}
public class OGM {
void foo () {}
void foo (int a) { //正确
}
void bar() {}
void bab () {}
}
5
【规则1_7】 一个类的代码行不超过2000行。 |
保存路径: Jtest4.5\jrules\ METRICS_CTNL.rule
目录:Rules-UserDefinedRules-METRICS
3
【规则1_8】 一个方法的代码行不超过300行。 |
保存路径: Jtest4.5\jrules\ METRICS_TNLM.rule
目录 :Rules-UserDefinedRules-METRICS
3
2 2 代码书写规则
【规则2_1】每行只有一个句子,提高代码可读性。 |
public class OSPL {
int method (int a, int b) {
int i = a + b; return i; //违例
}
}
public class OSPLFixed {
int method (int a, int b) {
int i = a + b; // 正确
return i; // 正确
}
}
保存路径: Jtest4.5\jrules\format_OSPL.rule
目录:Rules-UserDefinedRules-FORMAT
3
【规则2_2】 每行不能超过120个字符。 |
保存路径: Jtest4.5\jrules\FORMAT_LL.rule
目录:Rules-UserDefinedRules-FORMAT
3
【规则2_3】 长表达式(超过120列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐。 |
断行方法:
- 在逗号后断行
- 在操作符前断行
- 较高级别断行优于较低级别的断行
对齐方法:
- 将新行与同一级别的先前行的表达式的起始端对齐。
- 条件表达式的续行在第一个条件处对齐。
- for循环语句的续行在初始化条件语句处对齐。
- 函数调用和函数声明的续行在第一个参数处对齐。
- 赋值语句的续行应在赋值号处对齐。
- 如果上述规则导致代码排列混乱或代码左边界少于两个缩进,可用两倍缩进替代。
下面是一些断行方法调用的示例:
someMethod(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
下面是两个断行算术表达式例子,第一个是优选方法,因为断行出现在括号表达式之外,属于较高级别的断行。
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; //允许的断行方法
longName1 = longName2 * (longName3 + longName4
-longName5) + 4 * longname6; //应该避免的断行方法
下面是两个缩排方法的例子,第一个是传统的方式,第二个例子中如果采用传统方式缩排将导致第二行和第三行右边出现太多空白,因此,采用8个空格符替代。
//传统的缩排方法,第二行与第一行的括号对齐。
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...//你代码的位置
}
//由8个空格符来替代与括号对齐的方法,以避免第二行、第三行出现太多的空格符
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...//你代码的位置
}
对于if语句的行封装通常使用8空格规则,因为传统的4空格缩排方式使得有些语句容易被忽略掉,使if语句体难以理解。例如:
//不允许使用下面的缩进方法
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) { //不好的封闭
doSomethingAboutIt(); //这样对齐的封闭很容易让阅读的人忽略掉这一行
}
//宜采用下面的缩进方法(分成三行的情况)
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
//或使用下面的缩进方法(分成二行的情况)
if ((condition1 && condition2) || (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
对于三重表达式,有三种方式可以对它进行格式化:
//单行的情况
alpha = (aLongBooleanExpression) ? beta : gamma;
//分成两行的情况,第二行的冒号与第一行的问号对齐。
alpha = (aLongBooleanExpression) ? beta
: gamma;
//分成三行的情况,第二行的问号和第三行的冒号都与第一行的括号对齐
alpha = (aLongBooleanExpression)
? beta
: gamma;
暂不需要
3
【规则2_4】 用空格(4个空格)替代tab键,4个空格为一缩进单位,避免不同编辑器之间的差异而导致代码布局混乱。 |
保存路径: Jtest4.5\jrules\format_DUT.rule
目录:Rules-UserDefinedRules-FORMAT
保存路径: Jtest4.5\jrules\format_IND.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_5】 package语句后用空行和import语句分隔开。不同类别的import语句之间用空行分隔。 |
package语句其后可跟import语句,而且与package间隔一个空行。import包的排列顺序为java开头的包在最前面,接下来是引自外部的包,再接下来是应用程序自身的包,即import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如:
package com.zte;
import java.awt.peer.CanvasPeer; //java自身的包
import java.io……;
import com.klg.field……; //第三方的包
import com.zte.ums.uep……; //程序自身的包
暂不需要
4
【规则2_6】 方法之间要有一空行,不同的逻辑块之间也要有空行,在定义类和接口之前要有空行,提高代码可读性。 |
暂不需要
4
【规则2_7】 “}”一定独占一行,并且它们后面都没有语句。 |
保存路径: Jtest4.5\jrules\format_CBRACE.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_8】 ”{”不能独占一行,并且前面应该有空格,后面不能够有语句。 |
保存路径: Jtest4.5\jrules\format_BRACE_SPACE.rule
目录:Rules-UserDefinedRules-FORMAT
保存路径: Jtest4.5\jrules\format_FCB.rule
目录:Rules-UserDefinedRules-FORMAT
保存路径: Jtest4.5\jrules\ format_NSAB.rule
目录:Rules-UserDefinedRules-FORMAT [z1]
4
【规则2_9】 “(”后面不能够有空格,”)”前面不能够有空格。 |
待定
4
【规则2_10】 定义方法时,方法名字和”( ”之间没有空格。 |
class MSP {
public void method () { //违例
}
public void method1 () { //违例
}
}
class MSPFixed {
public void method() { // 正确
}
public void method1 () { // 正确
}
}
保存路径: Jtest4.5\jrules\FORMAT_MSP2.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_11】 “if”、”for”、”while”、”switch”关键字和”()”之间要有一个空格。 |
保存路径: Jtest4.5\jrules\format_SC.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_12】 在声明方法中,形式参数之间(逗号以后)要有一空格,提高代码可读性。 |
public class SAC {
public void method (int i,int j) { } //违例
}
public class SAC {
public void method (int i, int j) { } //正确
}
保存路径: Jtest4.5\jrules\format_SAC.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_13】 在for循环中语句中,分号之后要有一空格,提高代码可读性。 |
public class SAS {
public void method () {
for (int i = 0;i < 10;i++) { //违例
System.out.println ("i: " + i);
}
}
}
public class SAS {
public void method () {
for (int i = 0; i < 10; i++) { //正确
System.out.println ("i: " + i);
}
}
}
保存路径: Jtest4.5\jrules\format_SAS.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_14】 在一元(“++”,”--”)运算符和变量之间不允许有空格,提高代码可读性。 |
public class SAUOP {
public void method (int x) {
System.out.println("x: " + ++ x); // 违例
}
}
public class SAUOP {
public void method (int x) {
System.out.println("x: " + x ++); // 违例
}
}
public class SAUOP {
public void method (int x) {
System.out.println("x: " + ++x); // 正确
}
}
public class SAUOP {
public void method (int x) {
System.out.println("x: " + x++); // 正确
}
}
保存路径: Jtest4.5\jrules\format_SAUOP.rule
目录:Rules-UserDefinedRules-FORMAT
保存路径: Jtest4.5\jrules\format_SBUOP.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_15】 在二元(“>>”,”<<”,”|”,”^ ”)运算符和变量之间要有空格。 |
public class SBOP {
public void method (int x, int y) {
int z = x>>y; //违例
z = z&0xff; //违例
}
}
public class SBOPFixed {
public void method (int x, int y) {
int z = x | y; //正确
z = z & 0xff; //正确
}
}
保存路径: Jtest4.5\jrules\format_SBOP.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_16】在运算符(“?”)前后都要有空格;在二元(“||”,”&&”,”<=”,”==”) 逻辑运算符前后都要有空格。 |
保存路径: Jtest4.5\jrules\format_SCOP.rule
目录:Rules-UserDefinedRules-FORMAT
保存路径: Jtest4.5\jrules\format_SLOP.rule
目录:Rules-UserDefinedRules-FORMAT
保存路径: Jtest4.5\jrules\format_SROP.rule
目录:Rules-UserDefinedRules-FORMAT
4
【规则2_17】 类型强制转换后面应该有一空格。 |
保存路径: Jtest4.5\jrules\format_CMS.rule
目录:Rules-UserDefinedRules-FORMA
4
【规则2_18】 对于非界面的程序,用大写标识符静态变量替代数字常量和字符串常量,避免直接使用数字常量,提高代码可读性。 |
指定的常量(final,static变量)的采用可以使得代码更容易被理解与维护当代码中使用如下的整型常量时,Jtest不报错:-1,0,1,2,3,4,5,6,7,8,9,10
class USN {
int[] getArray () {
return new int [1000]; //违例
}
}
class USNFixed {
int[] getArray () {
return new int [ARRAY_SIZE]; //正确
}
private static final int ARRAY_SIZE = 1000;
}
某些类,特别是界面类中,无法满足此要求。对于这种例外情况,在类的注释中增加说明:@JTI2_18,则不检查此类。
保存路径: Jtest4.5\jrules\CODSTA_USN. rule
目录:Rules-UserDefinedRules-CODSTA
3
【规则2_19】 import语句必须引用到具体的类。 |
在某些不同的包下,可能存在相同的类名,如果不指明具体的类名称,可能会引起潜在的错误。
import java.util.*;
import java.util.Hashtable
保存路径: Jtest4.5\jrules\CODSTA_IMPT. rule
目录:Rules-UserDefinedRules-CODSTA
3
3 3 命名规则
命名规范的目的是提高程序的可读性,使程序易于理解。
命名的基本原则:
较好的命名应该象firstName、grandTotal、CorporateCustomer, 而诸如x1、y1等命名反映任何命名含义,而且造成代码难以理解、维护和改进。
软件开发人员应注意软件用户的一些约定术语,不应当随意的创造术语。这会降低软件的易维护性。
一般情况下应该用小写字母来命名,其中类(class)和接口(interface)名称的首字母用大写。
设计命名中应该慎用缩写命名。如要采用,则应采用统一的缩略规则,并且在文中的相应部分统一采用缩写。例如,采用num作为number的缩写,那么在整个文档中应该始终使用该缩写。
命名的长度一般小于30个字母,最好不要超过15个字母。
命名时应避免采用几乎相同的名称。例如,变量名称persistentObject和persistentObjects不应当同时运用;anSqlDatabase和anSQLDatabase也不应同时使用。
有时名称中会含有固定的缩略词,例如SQL代表Standard Query Language. 而在命名时sqlDatabase和SqlDatabase就比sQLDatabase和SQLDatabase易于阅读。
【规则3_1】 标识符只能由26个英文字母,10个数字,及下划线的一个子集来组成,并严格禁止使用连续的下划线。 |
这样做的目的是为了使程序易读。因为 variable_name 和 variable__name 很难区分,下划线符号‘_’若出现在标识符头或结尾,容易与不带下划线‘_’的标识符混淆。用户定义的标识符下划线也不能出现在标识符结尾
暂不需要
3
【建议】 标识符应当使用完整的英文描述,标识符的命名应当符合“min-length && max-information”原则,谨慎使用缩写。 |
对于标识符应当使用完整的英文进行描述,对于整个描述较长的,可对单词进行缩略。对单词的缩略可按较短的单词可通过去掉“元音”形成缩写,较长的单词可取单词的头几个字母形成缩写,一些单词有大家公认的缩写,常用单词的缩写必须统一。协议中的单词的缩写与协议保持一致。对于某个系统使用的专用缩写应该在某处做统一说明。设计命名中应该慎用缩写命名。如要采用,则应采用统一的缩略规则,并且在代码的相应部分统一采用缩写。例如,采用num作为number的缩写,那么在整个代码中应该始终使用该缩写。
5
【建议】标识符前最好不加个人姓名、姓名缩写、项目、产品、部门的标识。 |
这样做的目的是为了代码的可重用性
5
【建议】 保证用户自定义非静态字段命名、非静态局部变量命名、非静态方法命名、方法形式参数命名、静态方法命名等符合正则表达式。 |
5
【规则3_3】 程序中不要出现仅靠大小写区分的相似的标识符。 |
命名时应避免采用几乎相同的名称。例如,变量名称persistentObject和persistentObjects不应当同时运用;anSqlDatabase和anSQLDatabase也不应同时使用。
待定。
1
【规则3_4】保证包名全部用小写字母命名,在构成包名的单词之间不用下划线。 |
包名是一个顶级域名(如当前的com,edu,gov,mil,net,org)或服从ISO Atandsrd 3166,1981中规定的两英文字母国家标识符。
包名称的随后成份根据组织自身的命名规范变化。这样的规范或许通过指定分公司、部门、项目、机器、帐户等来确定目录名成分。请看下面的示例说明:
com.sun.eng
com.apple.quicktime.v2
edu.cmu.cs.bovik.cheese
保存路径: Jtest4.5\jrules\NAMING_PKG.rule
目录:Rules-UserDefinedRules-NAMING
3
【规则3_5】 类名首字母大写,构成类名的单词之间用大小写分割,之间不用下划线。 |
保存路径: Jtest4.5\jrules\ NAMING_CNX.rues
目录:Rules-UserDefinedRules-NAMING
3
【规则3_6】 方法名称应采用完整的英文单词组成,首字母小写,在构成方法名的单词之间不用下划线。 |
方法名力求清晰、明了,通过方法名就能够判断方法的主要功能。方法名中不同意义字段之间不要用下划线连接,而要把每个字段的首字母大写以示区分。方法命名采用大小写字母结合的形式,但专有名词不受限制。
保存路径: Jtest4.5\jrules\ NAMING _MNX.rues
目录:Rules-UserDefinedRules-NAMING
3
【规则3_7】常量静态字段全部用大写字母,构成标识符的多个单词之间用下划线分隔。 |
class USF {
public static final int size = 10; //违例
}
class USFFixed {
public static final int SIZE = 10; //正确
}
保存路径: Jtest4.5\jrules\NAMING_USF.rule
目录:Rules-UserDefinedRules-NAMING
3
【规则3_8】非静态、常量字段,包括全局变量和局部变量首字母小写。 |
保存路径: 内嵌
目录 Rules-Built-in Rules-Naming Convention(NAMING)。
2
【规则3_9】方法参数的首字母小写。 |
保存路径: 内嵌
目录 Rules-Built-in Rules-Naming Convention(NAMING)。
2
【规则3_10】 以get打头的方法不能返回boolean值。 |
public class GETA {
public int method () { //违例
return _count;
}
private int _count = 100;
}
public class GETAFixed {
public int getCount () {
return _count;
}
private int _count = 2; //正确
}
保存路径: Jtest4.5\jrules\NAMING_GETA.rule
目录:Rules-UserDefinedRules-NAMING
3
【规则3_11】 获取器方法返回值是boolean型的要以”is”,”have”,”can”,”has”打头,提高代码可读性。 |
public class GETB {
public boolean method () { //违例
return _ready;
}
private boolean _ready = false;
}
public class GETBFixed {
public boolean isReady () { //正确
return _ready;
}
private boolean _ready = false;
}
保存路径: Jtest4.5\jrules\NAMING_GETB.rule
目录:Rules-UserDefinedRules-NAMING
3
【规则3_12】 用”is”,”have”,”can”,”has”打头的方法必须返回boolean型. |
public class IRB {
public int isOK () { //违例
return _value;
}
private int _value;
}
public class IRBFixed {
public boolean isOK () { //正确
return _value;
}
private boolean _value;
}
保存路径: Jtest4.5\jrules\NAMING_IRB.rule
目录:Rules-UserDefinedRules-NAMING
3
【建议】 使用习惯的变量命名规则,增强代码的维护性。 |
对于定义单个字母表示的变量一般遵循以下的规则:
· b 表示一个字节
· c 表示一个字符
· d 表示一个double
· f 表示一个float
· i, j, k 表示整数
· l表示一个常整形
· o表示一个对象
· s表示一个字符串
public class CVN {
void method () {
int b = 1; //违例
}
}
public class CVNFixed {
void method () {
int i = 1; //正确
}
}
5
【建议】 组件接口的命名应该采用全英文单词,后缀为该组件的类型;命名应能够较好表达该组件的用途,并使得该组件易于在applet或application中查找。 |
组件名称应避免诸如botton1、botton2等抽象的名称。建议组件接口命名时,前缀是组件的类型,因为控件的设计基本上都是可视化开发环境,当在界面上添加某个控件时,控件的名字都是有前缀(控件类型)+数字组成的,这样只需要修改数字即可,也不必移动光标,节省编写代码时间。
5
【规则3_14】 数组(array)和vector的命名方法是,用array和vector所存对象名称的复数表示,名称为全英文单词组成,非开头单词的首字母采用大写。 |
保存路径: Jtest4.5\jrules\NAMING_ARRS.rule
目录:Rules-UserDefinedRules-NAMING
保存路径: Jtest4.5\jrules\ NAMING _VECS.rule
目录:Rules-UserDefinedRules-NAMING
3
【规则3_15】 数据流的命名以in或out或inOut打头。 |
:这是Sun公司的约定。
命名用in +“流名称”;
命名用out +“流名称”;
命名用inOut +“流名称”;
保存路径: Jtest4.5\jrules\FORMAT_INOUT.rule
目录:Rules-UserDefinedRules-FORMAT
3
【规则3_16】 避免类方法和构造函数同名,提高代码可读性。 |
public class NAMING {
public NAMING () {} //构造函数
public void NAMING (int size) {} //违例
}
public class NAMINGFixed {
public NAMINGFixed () {} //构造函数
public NAMINGFixed (int size) {} //正确
}
保存路径: Jtest4.5\jrules\PB_NAMING.rule
目录:Rules-UserDefinedRules-PB
1
【规则3_17】 避免方法内的局部变量名称和类成员变量同名,提高代码可读性。 |
public class HMF {
public void method () {
final int i = 5; //违例
System.out.println (i);
}
private int i = 0;
}
public class HMFFixed {
public void method () {
final int x = 5; //正确
System.out.println (x);
}
private int i = 0;
}
保存路径: Jtest4.5\jrules\MISC_HMF.rule
目录:Rules-UserDefinedRules-MISC
1
【规则3_18】 避免类成员变量的名字和方法中的参数同名,提高代码可读性。 |
public class MPC {
void method (int i, int j) {} //违例
void j() {}
private int i = 0;
}
public class MPCFixed {
void method (int first, int second) {} //正确
void j() {}
private int i = 0;
}
保存路径: Jtest4.5\jrules\PB_MPC.rule
目录:Rules-UserDefinedRules-PB
2
4 4 声明规则
【规则4_1】 避免在一个声明语句中声明多个不同类型变量,比如一个整型变量,一个整型变量数组;避免在一个声明语句中声明多个变量,同时方便注释。 |
class VDT{
private int index, index1[]; //违例:一个整型,一个整型数组
public void method ()
{
int aaa, bbb[]; //违例:一个整型,一个整型数组
int ccc;
int ddd;
}
}
class MVOS {
String s1,s2; //违例:同一个声明语句声明两个变量
public MVOS()
{
s1 = "hello";
s2 = "world";
}
}
class VDT {
private int index,
private index1[]; //正确
public void method () {
int aaa,
int bbb[]; //正确
int ccc;
int ddd;
}
}
class MVOS {
String s1; //正确
String s2; //正确
public MVOS() {
s1 = "hello";
s2 = "world";
}
}
避免在一个声明语句中声明多个不同类型变量
保存路径: Jtest4.5\jrules\CODSTA_VDT.rule
目录:Rules-UserDefinedRules-CODSTA
避免在一个声明语句中声明多个变量
保存路径: Jtest4.5\jrules\CODSTA_MVOS. rule
目录:Rules-UserDefinedRules-CODSTA
3
【建议】变量声明只应该放在代码段的开始部分。最好不要到使用时才声明变量。 |
代码段是指花括号{}所包括的区域。唯一的例外是for循环中的循环变量。
void myMethod()
{
int myInt = 0; //方法块的开始
if (condition)
{
int yourInt = 0; //”if”块的开始
//其它语句
}
}
5
【规则4_2】在循环体中避免声明变量,提高代码运行性能。 |
public class LOOP {
public void method(int max) {
for (int i = 0; i < max; i++) {
StringBuffer sb = new StringBuffer(); //违例
sb.append("loop: ");
sb.append(i);
System.out.println(sb.toString());
}
}
}
public class LOOPFixed {
public void method(int max) {
StringBuffer sb = new StringBuffer(); //正确
for (int i = 0; i < max; i++) {
sb.append("loop: ");
sb.append(i);
System.out.println(sb.toString());
sb.setLength(0);
}
}
}
保存路径: Jtest4.5\jrules\ OPT_LOOP.rule
目录:Rules-UserDefinedRules-Optimization(OPT)
1
【规则4_4】 声明长整形long变量时,结尾用大写字母”L”代替小写字母”l”,避免和数字”1”混淆,提高代码可读性。 |
保存路径: Jtest4.5\jrules\CODSTA_LONG. rule
目录:Rules-UserDefinedRules-CODSTA
3
【规则4_5】 声明数组时”[]”放在数组变量的前面,这和C/C++正好相反。 |
public class IAD {
private int attr[]; //违例
private String str1[]; //违例
}
public class IADFixed {
private int[] attr; // 正确
private String[] str1; // 正确
}
保存路径: Jtest4.5\jrules\format_IAD.rule
目录:Rules-UserDefinedRules-FORMAT
3
【规则 |
public class DUD {
Date d[]; // 违例
}
public class DUD {
long d[]; // 正确
}
保存路径: Jtest4.5\jrules\GC_DUD.rule
目录:Rules-UserDefinedRules-GC
3
【规则4_7】 对于不是实现接口的或者是重载的方法,如果没有使用任何实例类成员,包括方法和字段,那么就把方法声明为静态的,提高代码的封装性。 |
public class ASI {
public int add (int i, int j) { //违例
return i + j;
}
}
public class ASIFixed {
public static int method (int i, int j) { //正确
return i + j;
}
}
保存路径: Jtest4.5\jrules\CODSTA_ASI. rule
目录:Rules-UserDefinedRules-CODSTA
3
【建议】 对于一个子系统的代码,在一个接口中定义所有常量,提高代码的可维护性。 |
在一个类定义所有常量和在一个接口中定义所有常量没有什么区别,由用户来决定。
class DCI {
int getMax () {
return MAX;
}
static final int MAX = 1000; //违例
}
class DCI {
int getMax () {
return Constants.MAX;
}
}
interface Constants {
int MAX = 1000;
}
5
【规则 |
interface AAI {
public void method (); //违例: 多余的"public"
abstract int getSize (); //违例: 多余的"abstract"
static int SIZE = 100; //违例: 多余的"static"
}
interface AAIFixed {
void method (); //正确
int getSize (); //正确
int SIZE = 100; //正确
}
保存路径: 内嵌
目录 Rules-Built-in Rules-Unused Code (UC)
2
【规则 |
abstract class ASFI { //违例
abstract void method();
final static String ID = "final static string";
}
interface ASFIFixed { //正确
void method();
String ID = "MISC_ASFI";
}
保存路径: Jtest4.5\jrules\MISC_ASFI.rule
目录:Rules-UserDefinedRules-MISC
1
【规则 |
public class FF {
private int size = 5; //违例
private int method (int x) {
return x + size;
}
}
public class FFFixed {
private final int size = 5; //正确
private int method (int x) {
return x + size;
}
}
保存路径: Jtest4.5\jrules\MISC_FF.rule
目录:Rules-UserDefinedRules-MISC
2
【规则 |
package examples.rules.misc;
public class FLV {
private int method (int x) {
int size = 5; //违例
return size + x;
}
}
Declare the variable "final".
package examples.rules.misc;
public class FLVFixed {
private int method (int x) {
final int size = 5; //正确
return size + x;
}
}
保存路径: Jtest4.5\jrules\MISC_FLV.rule
目录:Rules-UserDefinedRules-MISC
2
【规则 |
保存路径: Jtest4.5\jrules\SECURITY_INNER.rule
目录:Rules-UserDefinedRules-SECURITY
1
【规则 |
class PCTOR {
public PCTOR () { //违例
}
}
class PCTORFixed {
private PCTOR () { //正确
}
}
保存路径: Jtest4.5\jrules\MISC_PCTOR.rule
目录:Rules-UserDefinedRules-MISC
1
【规则 |
class APPF {
int _a = 10; //违例
private int _c = 14;
}
class APROF {
protected int _a = 10; //违例
}
class APROFFixed {
protected void setA (int a) { //正确
_a = a;
}
protected int getA () { //正确
return _a;
}
private int _a = 10; //正确
}
class APPFFixed {
public void setA (int a) { //正确
_a = a;
}
public int getA () { //正确
return _a;
}
private int _a = 10; //正确
private int _c = 14;
}
保存路径: Jtest4.5\jrules\OOP_APPF.rule
目录:Rules-UserDefinedRules-OOP
保存路径: Jtest4.5\jrules\OOP_APROF.rule
目录:Rules-UserDefinedRules-OOP
1
【建议】 避免使用public static final数组字段。 |
class PSFA {
public static final int[] MUTABLE = { 0 }; //违例
public static void main (String[] args) {
MUTABLE[0] = 1;
System.out.println ("MUTABLE[0]=" + MUTABLE[0]);
}
}
class PSFAFixed {
private static final int[] MUTABLE = { 0 }; //正确
public static final List unmutable =
Collections.unmodifiableList (Arrays.asList(MUTABLE));
}
保存路径: Jtest4.5\jrules\MISC_PSFA.rule
目录:Rules-UserDefinedRules-MISC
5
【规则 |
保存路径: Jtest4.5\jrules\UC_AUV.rule
目录:Rules-UserDefinedRules-UC
2
【规则 |
保存路径: Jtest4.5\jrules\UC_UP.rule
目录:Rules-UserDefinedRules-UC
2
5 5 表达式和语句规则
【规则5_1】 If语句和else语句写成{ }代码块。 |
public class BLKIF {
public void method (boolean b) {
if (b) //违例
System.out.println ("inside of if");
else //违例
System.out.println ("OUTSIDE of if");
}
}
public class BLKIF {
public void method (boolean b) {
if (b) { //正确
System.out.println ("inside of if");
}
else { //正确
System.out.println ("OUTSIDE of if");
}
}
}
保存路径: Jtest4.5\jrules\MISC_BLKIF.rule
目录:Rules-UserDefinedRules-MISC
保存路径: Jtest4.5\jrules\MISC_BLKELSE.rule
目录:Rules-UserDefinedRules-MISC
3
【规则5_2】 避免if语句后的空语句体。 |
public class IEB {
void method (int i) {
if (i < 0) ; //违例
System.out.println("negative i");
}
}
public class IEBFixed {
void method (int i) {
if (i < 0) { //正确
System.out.println("negative i");
}
}
}
保存路径: 内嵌
目录 Rules-Built-in Rules-Possible Bugs (PB)
1
【规则5_3】 把数字常量放在比较表达式的右边。 |
保存路径: Jtest4.5\jrules\CODSTA_CRS. rule
目录:Rules-UserDefinedRules-CODSTA
3
【规则5_4】 避免在if条件语句中使用浮点型变量。 |
public class DCF {
int method (double d) {
if (d == 1.0) { //违例
return 1;
}
return 0;
}
}
public class DCFFixed {
int method (int d) { //正确
if (d == 1) {
return 1;
}
return 0;
}
}