Gao_JAVA编程规约

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层方法命名规约

  1. 获取单个对象的方法用get做前缀。
  2. 获取多个对象的方法用list做前缀。
  3. 获取统计值的方法用count做前缀。
  4. 插入的方法用save(推荐)或insert做前缀。
  5. 删除的方法用remove(推荐)或delete做前缀。
  6. 修改的方法用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代码可以使用卫语句,或者状态模式来实现。

本文参考《阿里巴巴JAVA开发手册》

posted @ 2020-02-14 20:24  某糕  阅读(278)  评论(0编辑  收藏  举报