开发命名规范
JAVA编码规范
目 录
3.2 if, if-else, if else-if else 语句 20
版本变更说明
版本 | 完稿时间 | 撰写人 | 说明 |
0.1 | 2013.1.6 | 曹钦 | 初稿 |
1.0 | 2013.4.19 | 魏利洁 | 定稿 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
本文描述了JAVA开发中的有关包、类、接口、方法、实例变量、变量和常量的命名规则,用于规范JAVA编程过程中的命名和代码书写规范。
开发一部JAVA开发组全体成员。
适用于开发部所有基于JAVA开发的项目。
开发组将基于JAVA开发中产生的包分为两类,一是与各业务系统相关的包,一是与业务系统无关的、可公用的包。
com.zxt.<projectname>.<modulename>。
其中: <projectname>为项目英文简称或缩写;<modulename>为模块英文名称或简称,如果无细分模块的话可省略模块名。
com.zxt.common.<modulename>//所有项目通用
com.zxt.<projectname>.common//单个项目内各模块通用
- 工具函数类包名前缀为——util
- Servlet类包名前缀为——servlet
- test case类包名前缀为——test
- 异常包名为——exception
- 接口实现包名——impl
- 基础包——base
类和接口的名称应是一个名词,采用大小写混和的方式,如果使用拼音则应是全拼,所有单词都应紧靠在一起,其中每个单词的首字母应大写,接口名称应以大写I开始。例如:
class User;
interface ICommonConnection;
class BuMen;//此处为部门全拼
第一个单词的首字母用小写,其后单词的首字母大写。
方法名应是一个动词或动名结构,采用大小写混和的方式,其中例如:
Xxxxx.getBmList();
每个方法前必须加说明包括:参数说明、返回值说明、异常说明。如果方法名实在是太长可以对变量名缩写,但是必须添加相应的说明。
例: public void getParameters()
public void setParameters(String strName)
- 对具有Boolean值的属性使用is/set命名模式
例: public boolean isRunning()
public void setRunning(boolean bRunning)
- 把值加入到对象中使用load, put
例: public loadCorpExtInfo()
- 变换类型to
例: public toInt()
- 静态工厂valueOf
例:public static Boolean valueOf(boolean b) {
return (b ? Boolean.TRUE : Boolean.FALSE);
}
- 常用的命名方法:
动词 | 使用方法 |
get | 返回值。 |
set | 设定値(覆盖)。 |
is | 判断返回boolean |
load | 读取object |
insert | 将値读入object |
delete | 删除object |
update | 升级object |
search | 查找 |
put | 追加値(向列表等里面) |
| 向指定的stream里输出 |
to | 变换类型 |
变量命名一般采用大小写混和的方式,第一个单词的首字母小写,其后单词的首字母大写,变量名一般不要用下划线或美元符号开头。变量名应简短且有意义,即,能够指出其用途。除非是一次性的临时变量,应尽量避免单个字符的变量名。
(1)类的实例对象定义如下:
Person person;
(2)同一个类的多个对象可以采用一下定义方式:
Person person1;
Person person2;
(3)集合类的实例命名使用集合包含元素的英文名称的复数表示,例如:
Vector persons;
(4)如果变量名实在是太长可以对变量名缩写,但是必须在类说明或方法说明部分(视缩写的范围而定)进行说明。
(5)数组的声明要用"int[] packets"的形式,而不要用"int packets[]"。
变量的命名采用匈牙利命名法,即由小写的前缀加上首字母大写的英文单词组成,但前缀可以不加。
类型 | 缩写(前缀) |
int, Integer | int |
long | lng |
float | flt |
double | dbl |
byte | byt |
boolean | bln |
Date | dat |
char | chr |
String | str |
StringTokenizer | stk |
StringBuffer | sb |
Exception | e |
SQLException | sqle |
Other Exception | ex |
Properties | prps |
Application | app |
Request | req |
Response | res |
Session | sess |
Cookie | ck |
Connection | conn |
Statement | stmt |
PrepareStatement | ps |
CallableStatement | cs |
Resultset | rs |
Collection | clt |
ArrayList | al |
Vector | vc |
HashTable | ht |
Object | obj |
其他 | 不加前缀 |
一般采用i、j、k、m、n表示。
例如:
for (int i=0;i<10;i++){}
类常量和ANSI常量的命名应全部用大写,单词间用下划线隔开。例如:
final static int MIN_WIDTH = 4;
- final static int MAX_WIDTH = 99;
代码书写规范
- 类的方法的代码行数不能过长,尽量控制在100行(不包括空行)以内,长的方法要拆分成私有函数。
- 页宽应该设置为80字符. 源代码一般不超过这个宽度, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进4个字符.
- 程序(.java)文档建议采用Javadoc自动生成。
- 在程序编写时,要通过行缩进体现代码的层次感。
- 为了避免冲突,import的时候尽量精确到类名字(即不要使用*)。
- import包按以下顺序,每一类import后面加一个换行。
- jdk标准包
- java扩展包(例如servlet,javamail,jce等)
- 使用的外部库的包(例如xml parser)
- 使用的项目的公共包
- 使用的模块的其他包
【范例】
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.mail.*;
import org.apache.xml.*;
import net.ebseries.*;
import net.ebseries.util.*;
import net.ebseries.ebwebmail.*;
- 每一行至多只有一条语句。
【范例】
argv++; //正确
argc--; //正确
argv++; argc--; //避免
- “{”必须在复合语句起始处的一行的末尾,“}”必须在复合语句结尾另起一行。
【范例】
for (int i=0;i<10;i++){
intCount=i;
}
当一个表达式不能在一行里写完,需要转行,按照以下规则转行:
- 在一个逗号后转行。
- 在一个操作符前。
- 数学表达式转行尽量在高的级别而不在低的级别上(参见例子)。
- 在上一行同一级别的位置对齐新的一行。
- 如果以上的规则导致混乱,以8个缩进格代替。
【范例】
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) {
...
}
行转行 如果按照通常的缩进(4格)会看不清楚,行转行缩进规定一般是缩进8格。例如:
//不要用这种缩进
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) { //错误的转行
doSomethingAboutIt(); //使这行容易混淆
}
//要用这种缩进
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
- 避免太多的使用synchronized关键字,应该在必要的时候再使用,这是一个避免死锁的好方法。
- if, for语句的逻辑不要太深。这样可读性会非常低,因此请尽量控制在最多三层。 还需要更深时,另外作为一个private method分开处理。
- 变量声明的顺序:public——>protected——>private;
- 使用?:操作时必须写在一行中,并且判断条件必须加括号:
【范例】
return ((i==j) ? intSize : intDefaultSize)
- 没有特别的考虑,变量都必须赋予初始值;类必须进行实例化;
- 变量的定义应该放在程序块(条件、循环等)的外面;
- 变量应逐个进行声明,不要将多个变量放在一行中进行声明;
- 空的方法体必须在一行中完成:
【范例】
public static void main(String[] args) throws SQLException {}
- 方法之间必须用空行隔开;
- 由于数据库不区分大小写,只能采用驼峰命名法,Java程序中和数据库对应的属性不允许驼峰命名法,必须转换成匈牙利命名法。
- 避免用实例访问类的静态值和方法,应该用类名。
【范例】
classMethod(); //赞成
AClass.classMethod(); //赞成
anObject.classMethod(); //避免
- 避免在一条语句里给几个变量赋同一个值。
【范例】
fooBar.fChar = barFoo.lchar = 'c'; //避免
- 用圆括号避免优先级的不同,防止出错。
【范例】
if (a == b && c == d) //避免
if ((a == b) && (c == d)) //赞成
- 尽量使结构符合预期的目的。
【范例】
if (booleanExpression) {
return true;
} else {
return false;
}
应写成
return booleanExpression;
同样的
if (condition) {
return x;
}
return y;
应写成
return (condition ? x : y);
- 整个项目要自始至终采用一种编码方式,如java部分采用utf-8编码,jsp部分也要采用此编码。建议使用UTF-8编码方式
if语句必须用{}。
【范例】
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else{
statements;
}
避免下面的写法:
if (condition) //不赞成
statement;
for语句必须用{}。
【范例】
for (initialization; condition; update) {
statements;
}
while语句必须用{}。
【范例】
while (condition) {
statements;
}
do-while语句必须用{}。
【范例】
do {
statements;
} while (condition);
每一个 switch 必须包括默认子句(default),默认子句中的break是多余的,但它预防流程出错。
【范例】
switch (condition) {
case ABC:
statements;
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
【范例】
try {
statements;
} catch (Exception e) {
statements;
} finally {
statements;
}
- 在一般情况下,方法返回值不应返回null。而是尽量使用异常代替返回null。如果在特殊情况必须返回null, 必须在方法说明中加以特别说明,如使用“特别注意”等字样。例如:从一个集合类实例中提取一个对象,因为有些集合类实例是允许null作为键或值的,这个时候用异常取代返回null就不合适了。
- 如果方法的返回值是集合类对象,而且返回的集合对象不包含任何元素时,则应返回0长度或0大小的集合对象。不能返回null。
- 返回值除了比较的情况之外,尽量不用括号。
【范例】
return;
return myDisk.size();
return (size ? size : defaultSize);
- 一般在try..catch之后,用finally保证资源的正确释放
- 严禁忽略Exception(如catch(…){},括号内没有处理),这样的程序可读性很差。
整个应用系统使用自行设计的唯一异常类,该类包括message(表示错误信息)和ID号(整型,表示异常类型)两部分,该类在创建时是自动获得类名、方法名、行号等信息。
在系统开发和上线之后的一段时间内,异常信息要直接发送到浏览器页面,以便于开发人员迅速定位错误。
- 所有的算术、逻辑表达式的每一项运算都需要加圆括号,避免使用java语言的运算符优先级,例如:
(2 *(x + y))/(1 - x);
((n > 1)?(n - 1):(n = 1))
result =(result && (lastOperand > nextOperand));
- 二元算术运算符(除去“/”)、二元逻辑元素符、赋值运算符,既“+、-、*、%、+=、-=、*=、/=、%=、>、<、 ==、 >=、<=、 =”等符号左右两边要加空格,
【范例】
if(lastOperand >= lastOperand)
参数说明部分的逗号“,”和for语句循环说明部分的分号“;”之前不需要留空格,之后需要留空格。
【范例】
Calculator.add(int a, int b);
for(int i = 0; i < 100; i ++);
体前代码包括:
-
- 方法的参数说明和异常说明;
- 条件语句,如if语句、switch语句;
- 循环语句,如while语句、for语句。
这些语句的参数说明、条件说明和循环控制都放在圆括号内。如果不是特别长,应尽量放在同一行内。
同时注意,参数说明、条件说明和循环控制的结束圆括号“)”与体开始花括号“{”之间留一个空格。
注释是软件可读性的具体体现。程序注释量一般占程序编码量的20%,软件工程要求不少于20%。以下是四种必要的注释:
- 类说明注释
注释一般位于 package/import 语句之前,class 描述之前。要求至少写出内容说明、创建者、创建时间和特别注意事项等内容。
【范例】
/**
* 名称: ${file_name}<br>
* 描述: <br>
* 类型: JAVA<br>
* 最近修改时间:${date} ${time}<br>
* @since ${date}
* @author 作者
*/
- 方法说明注释
对几乎每个方法都应有适当的说明,位于方法声明之前,包括:说明,参数说明、异常说明、返回值说明和特别说明等。【范例】:
/**
* 方法描述
*
* ${tags}
* @param id String唯一标识
* @param personid String 用户唯一标识
* @return rtobj BaseReturn 基本返回对象
* @变更记录 ${date} ${time} 作者 创建
*
*/
- 体内代码的注释
体(方法体、代码块体、静态代码块体等)内的代码按照功能分成多个虚拟的功能块,每个块以块注释“/* xxx */”注释开始,以空行结束;
【范例】:
/**是否超级管理员**/
private Boolean isadmin = false;
if(null!=curOuId&&!curOuId. equals (“”))
{
/*组织机构ID不为空时 */
curOuId = ‘000000’;
空行
}
空行
if(curOuId==null)
{
/*组织机构ID为空时 */
}
- 行注释
行注释“//”仅用于调试注释,在程序稳定之后,行注释必须被删除,以免影响程序的可读性。
当需要在他人代码中增加自己的代码的时候,请按照如下规则增加相应注释:
//Add By XXX(英文名字) For XXXXX(功能或模块,最好用英文) In YYYY-MM-DD Begin
……(所增加的代码)
//Add By XXX(英文名字) For XXXXX(功能或模块,最好用英文) In YYYY-MM-DD End
当需要修改他人写的代码的的时候,请按照如下规则增加注释并修改代码:
//Modify By XXX(英文名字) For XXXXX(功能或模块,最好用英文) In YYYY-MM-DD Begin
/*
*………(他人写的变更前的代码)
*/
…………(变更后的代码)
//Modify By XXX(英文名字) For XXXXX(功能或模块,最好用英文) In YYYY-MM-DD End
当需要删除他人写的代码的时候 ,请按照如下规则删除并增加注释:
//Remove By XXX(英文名字) For XXXXX(功能或模块,最好用英文) In YYYY-MM-DD Begin
/*
* …………(要删除的代码)
*/
//Remove By XXX(英文名字) For XXXXX(功能或模块,最好用英文) In YYYY-MM-DD End
- 严谨性原则:不能只按照正常的流程编写代码,对于非正常情况(如资源状态异常、对象为空、输入不合法、程序运行环境不正常等)必须给予处理。
处理的原则是:能自动恢复的尽量自动恢复,如果不能自动恢复,则提示信息必须友好、清楚,便于定位错误,同时在日志中必须记录。
- 封装性原则1:类属性的可见性不能为public
- 封装性原则2:在什么地方创建了对象或请求了资源,一般情况下必须就地释放对象或资源。
- 复用性原则1:必须使用pub等已经实现的方法,而不是重新编写;
- 复用性原则2:注重可复用性,将公共操作封装成公共方法,严禁拷贝重复代码。
- 复用性原则3:尽量采用多态方式实现程序的灵活性
即在父类中定义方法,在不同的子类中实现不同的处理。而其它用户在调用时,只需知道父类的接口,而不需知道不同子类的不同实现,最大程度的实现了程序的灵活性和封装性。