JAVA编程规约
(一)缩进
【强制】缩进采用4个空格,禁止使用tab字符。
说明:如果使用tab缩进,必须设置1个tab为4个空格。IDEA设置tab为4个空格时,请勿勾选Use tab character;而在eclipse中,必须勾选insert spaces for tabs。
正例:(涉及1-5点)
public static void main(String args[]) {
//缩进4个空格
String say = "hello";
//运算符的左右必须有一个空格
int flag = 0;
//关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格
if (flag == 0) {
System.out.println(say);
}
//左大括号前加空格且不换行;左大括号后换行
if (flag == 1) {
System.out.println("world");
//右大括号前换行,右大括号后有else,不用换行
} else {
System.out.println("ok");
//在右大括号后直接结束,则必须换行
}
}
(二)变量命名
1.【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例: _name / __name / $Object / name_ / name$ / Object$
2.【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。
注意,即使纯拼音命名方式也要避免采用。
反例: DaZhePromotion [打折] / getPingfenByName() [评分] / int某变量 = 3
正例: alibaba / taobao / youku / hangzhou等国际通用的名称,可视同英文。
3.【强制】成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式。参数变量统一小写。
正例: localValue / getHttpMessage() / inputUserId
4.【强制】中括号是数组类型的一部分,数组定义如下:String[] args;
反例:请勿使用String args[]的方式来定义。
5.【强制】POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
反例:定义为基本数据类型boolean isSuccess;的属性,
它的方法也是isSuccess(),RPC框架在反向解析的时候,“以为”对应的属性名称是success,导致属性获取不到,进而抛出异
常。
6.【强制】杜绝完全不规范的缩写,避免望文不知义。
反例: AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。
(三)每行最多字符数
【强制】单行字符数限制不超过 120个,超出需要换行,换行时遵循如下原则:
第二行相对第一行缩进 4个空格,从第三行开始,不再继续缩进,参考示例。
运算符与下文一起换行。
方法调用的点符号与下文一起换行。
在多个参数超长,逗号后进行换行。
在括号前不要换行,见反例。
正例:
StringBuffer sb = new StringBuffer();
//超过120个字符的情况下,换行缩进4个空格,并且方法前的点符号一起换行
sb.append("zi").append("xin")...
.append("huang")...
.append("huang")...
.append("huang");
反例:
StringBuffer sb = new StringBuffer();
//超过120个字符的情况下,不要在括号前换行
sb.append("zi").append("xin")...append
("huang");
//参数很多的方法调用可能超过120个字符,不要在逗号前换行
method(args1, args2, args3, ...
, argsX);
(四)函数最大行数
【强制】一个函数的有效语句不超过100行,超出需要进行优化。有效语句不包括空行,单括号行,注释行等。
(五)函数、类命名
1.【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例: _name / __name / $Object / name_ / name$ / Object$
2.【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。
注意,即使纯拼音命名方式也要避免采用。
反例: DaZhePromotion [打折] / getPingfenByName() [评分] / int某变量 = 3
正例: alibaba / taobao / youku / hangzhou等国际通用的名称,可视同英文。
3.【强制】类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / BO / DTO / VO等。
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
4.【强制】方法名、参数名都统一使用lowerCamelCase风格,必须遵从驼峰形式。
正例: localValue / getHttpMessage() / inputUserId
5.【强制】抽象类命名使用Abstract或Base开头;测试类命名以它要测试的类的名称开始,以Test结尾。
6.【强制】杜绝完全不规范的缩写,避免望文不知义。
反例: AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。
7.【参考】各层命名规约:
Service/DAO层方法命名规约
获取单个对象的方法用get做前缀。
获取多个对象的方法用list做前缀。
获取统计值的方法用count做前缀。
插入的方法用save(推荐)或insert做前缀。
删除的方法用remove(推荐)或delete做前缀。
修改的方法用update做前缀。
(六)常量
1.【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
正例: MAX_STOCK_COUNT
反例: MAX_COUNT
2.【强制】不允许出现任何魔法值(即未经定义的常量)直接出现在代码中。
反例: String key="Id#taobao_"+tradeId;
cache.put(key, value);
3.【强制】long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
说明:Long a = 2l;写的是数字的21,还是Long型的2?
4.【推荐】如果变量值仅在一个范围内变化用Enum类。如果还带有名称之外的延伸属性,必须使用Enum类,下面正例中的数字就是延伸信息,表示星期几。
正例:publicEnum{MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6), SUNDAY(7);}
(七)空行规则
【推荐】方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间插入一个空行。相同业务逻辑和语义之间不需要插入空行。
说明:没有必要插入多行空格进行隔开。
(八)注释规则
1.【强制】使用//注释,在被注释的代码块或行上方。注释与被注释代码的第一行对齐。
2.【推荐】代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。
说明:代码与注释更新不同步,就像路网与导航软件更新不同步一样,如果导航软件严重滞后,就失去了导航的意义。
3.【参考】注释掉的代码尽量要配合说明,而不是简单的注释掉。
说明:代码被注释掉有两种可能性:
1)后续会恢复此段代码逻辑。
2)永久不用。
前者如果没有备注信息,难以知晓注释动机。后者建议直接删掉(代码仓库保存了历史代码)。
(九)操作符前后空格
1.【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。
正例:下例中实参的"a",后边必须要有一个空格。
method("a", "b", "c");
2.【强制】任何运算符左右必须加一个空格。
说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三目运行符等。
3.【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码块则:
左大括号前不换行。
左大括号后换行。
右大括号前换行。
右大括号后还有else等代码则不换行;表示终止右大括号后必须换行。
4.【强制】左括号和后一个字符之间不出现空格;同样,右括号和前一个字符之间也不出现空格。
5.【强制】if/for/while/switch/do等保留字与左右括号之间都必须加空格。
正例:(涉及2-5点)
public static void main(String args[]) {
String say = "hello";
//运算符的左右必须有一个空格
int flag = 0;
//关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格
if (flag == 0) {
System.out.println(say);
}
//左大括号前加空格且不换行;左大括号后换行
if (flag == 1) {
System.out.println("world");
//右大括号前换行,右大括号后有else,不用换行
} else {
System.out.println("ok");
//在右大括号后直接结束,则必须换行
}
}
(十)其他规则
1.【推荐】没有必要增加若干空格来使某一行的字符与上一行的相应字符对齐。
正例:
int a = 3;
long b = 4L;
float c = 5F;
StringBuffer sb = new StringBuffer();
说明:增加sb这个变量,如果需要对齐,则给a、b、c都要增加几个空格,在变量比较多的
2.【推荐】当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读。
3.【强制】在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。
4.【强制】在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if (condition) statements;
5.【推荐】推荐尽量少用else, if-else的方式可以改写成:
if(condition){
...
return obj;
}
//接着写else的业务逻辑代码;
说明:如果非得使用if()...else if()...else...方式表达逻辑,【强制】请勿超过 3层,
超过请使用状态设计模式。
正例:逻辑上超过 3层的if-else代码可以使用卫语句,或者状态模式来实现。