- 【强制】不允许出现任何魔法值(即未经定义的常量)直接出现在代码中。
反例:
String key="Id#taobao_"+tradeId; | |
cache.put(key, value); |
(这个编译会报错的,通常 ide 会自检)
【强制】 long 或者 Long 初始赋值时,必须使用大写的 L,不能是小写的 l,小写容易跟数字 1
混淆,造成误解。
说明: Long a = 2l; 写的是数字的 21,还是 Long 型的 2?
(这个,长得太像了哈哈)【推荐】不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护。如:缓存
相关的常量放在类: CacheConsts 下;系统配置相关的常量放在类: ConfigConsts 下。
说明: 大而全的常量类,非得 ctrl+f 才定位到修改的常量,不利于理解,也不利于维护。
(这个有时为了统一,都放在一个类里了,但是有时遇到过中文常量在运行时乱码问题,也将中文常量以 unicode 形式放在 properties 文件里,用 spring 的 properties 工具去读,读过做缓存 - static)【推荐】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包
内共享常量、类内共享常量。- 1) 跨应用共享常量:放置在二方库中,通常是 client.jar 中的 const 目录下。
- 2) 应用内共享常量:放置在一方库的 modules 中的 const 目录下。
反例: 易懂变量也要统一定义成应用内共享常量,两位攻城师在两个类中分别定义了表示
“是” 的变量:- 类 A 中: public static final String YES = "yes";
- 类 B 中: public static final String YES = "y";
A.YES.equals (B.YES),预期是 true,但实际返回为 false,导致产生线上问题。
- 3) 子工程内部共享常量:即在当前子工程的 const 目录下。
- 4) 包内共享常量:即在当前包下单独的 const 目录下。
- 5) 类内共享常量:直接在类内部 private static final 定义。
说明一下库,一方库、二方库、三方库说明:
- 一方库:本工程中的各模块的相互依赖
- 二方库:公司内部的依赖库,一般指公司内部的其他项目发布的 jar 包
- 三方库:公司之外的开源库, 比如 apache、ibm、google 等发布的依赖
【推荐】如果变量值仅在一个范围内变化用 Enum 类。如果还带有名称之外的延伸属性,必须
使用 Enum 类,下面正例中的数字就是延伸信息,表示星期几。
正例:
public Enum{ | |
MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), | |
SATURDAY(6), SUNDAY(7); | |
} |
【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成 {} 即可,不需要换行;如果
是非空代码块则:- 1) 左大括号前不换行。
- 2) 左大括号后换行。
- 3) 右大括号前换行。
- 4) 右大括号后还有 else 等代码则不换行;表示终止右大括号后必须换行。
(曾经遇到过一个老外写的代码,左大括号前换行,看起来也很整齐)
【强制】 左括号和后一个字符之间不出现空格;同样,右括号和前一个字符之间也不出现空
格。详见第 5 条下方正例提示。
(就是有空格你也看不出来吧)【强制】 if/for/while/switch/do 等保留字与左右括号之间都必须加空格。
(不加不好看,一般都会加,何况 ide 自动生成已经加上了)【强制】任何运算符左右必须加一个空格。
说明: 运算符包括赋值运算符 =、逻辑运算符 &&、加减乘除符号、三目运行符等。
(这个是有强迫症吗,0.0,为什么会是强制的,我好多时候没有加)【强制】代码块缩进 4 个空格,如果使用 tab 缩进,请设置成 1 个 tab 为 4 个空格。
正例: (涉及 1-5 点)
public static void main(String args[]) { | |
// 缩进 4 个空格 | |
String say = "hello"; | |
// 运算符的左右必须有一个空格 | |
int flag = 0; | |
// 关键词 if 与括号之间必须有一个空格,括号内 f 与左括号, 1 与右括号不需要空格 | |
if (flag == 0) { | |
System.out.println(say); | |
} | |
// 左大括号前加空格且不换行;左大括号后换行 | |
if (flag == 1) { | |
System.out.println("world"); | |
// 右大括号前换行,右大括号后有 else,不用换行 | |
} else { | |
System.out.println("ok"); | |
// 右大括号做为结束,必须换行 | |
} | |
} |
(我用 idea 写过代码,然后 checkstyle,缩进什么的全都报错。。。)
- 【强制】单行字符数限制不超过 120 个,超出需要换行,换行时,遵循如下原则:
- 1) 换行时相对上一行缩进 4 个空格。
- 2) 运算符与下文一起换行。
- 3) 方法调用的点符号与下文一起换行。
- 4) 在多个参数超长,逗号后进行换行。
- 5) 在括号前不要换行,见反例。
正例:
StringBuffer sb = new StringBuffer(); | |
// 超过 120 个字符的情况下,换行缩进 4 个空格,并且方法前的点符号一起换行 | |
sb.append("zi").append("xin")… | |
.append("huang"); |
反例:
StringBuffer sb = new StringBuffer(); | |
// 超过 120 个字符的情况下,不要在括号前换行 | |
sb.append("zi").append("xin")…append | |
("huang"); | |
// 参数很多的方法调用也超过 120 个字符,逗号后才是换行处 | |
method(args1, args2, args3, ... | |
, argsX); |
(经常在判断时写得老长)
【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。
正例: 下例中实参的 "a", 后边必须要有一个空格。
method ("a", "b", "c"); (习惯性不加空格。。。)【推荐】没有必要增加若干空格来使某一行的字符与上一行的相应字符对齐。
正例:
int a = 3; | |
long b = 4L; | |
float c = 5F; | |
StringBuffer sb = new StringBuffer(); |
说明: 增加 sb 这个变量,如果需要对齐,则给 a、 b、 c 都要增加几个空格,在变量比较多的
情况下,是一种累赘的事情。
(有时为了好看还真加过)
【强制】 IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式,不
要使用 windows 格式。
("\n" 吗)【推荐】方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之
间插入一个空行。相同业务逻辑和语义之间不需要插入空行。
说明: 没有必要插入多行空格进行隔开。
(通常把变量和方法之间补上一个空行)