下午看了《Easy Coding》代码风格一章,整理一下。
命名规范
命名特征
- 清晰表明意图,避免误导
- 自注释
- 不随意使用不规范的缩写
- 除非通用的名称(如huawei),否则禁止使用拼音命名
方法名
采用小驼峰,一般为动词,与参数组成动宾结构,如StringBuilder的append(String)。
包名
统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词,且使用单数形式,如java.util.lang
类名
大驼峰,如StringBuilder
抽象类名
使用Abstract或Base开头,如AbstractList
异常类
使用Exception结尾,如IOException
测试类
以Test结尾,如StringBuilderTest
枚举类
以Enum结尾,枚举成员名称需要全部大写,单词间用下划线隔开,如ColorEnum
变量
采用小驼峰。
局部变量
局部变量被声明的位置,应该是接近它们首次使用的位置。
数组
类型与中括号相邻,如String[] colors,而非String colors[]
POJO类中布尔类型的变量
在定义类成员变量时,特别是在POJO类中,针对布尔型的变量,命名不要加
is前缀,否则部分框架解析会引起序列化错误。 例如,定义表示是否删除的成员变量为Boolean isDeleted,它的getter方法也是isDeleted()。框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致获取不到属性,进而抛出异常。但是在数据库建表中,推荐表达式是与否的值采用is_xxx的命名形式,针对这种情况,需要在<resultMap>中设置,将数据表中的is_xxx字段映射到POJO类中的属性Xxx。 -- 《Easy Coding》
常量
常量分类
- 公共常量和类内常量使用:字母全大写、单词之间加下划线,如
Integer.MAX_VALUE - 局部常量:小驼峰即可
常量分类标准可参见:java基础-关键字final
魔鬼数字/魔鬼字符串
魔鬼值必须预先使用见名知意的常量定义后,才能使用。公认的字面值是可以不需要预先定义,但是如果具备了特殊的含义,就必须定义出有意义的常量名称,如在TreeMap源码中,表示红黑树节点颜色的true和false就被定义称为类内变量,以方便理解:
private static final boolean RED = false;
private static final boolean BLACK = true;
代码展示风格
缩进、空格与空行
编码格式
java源文件编码格式必须是UTF-8,唯一允许出现的空白字符是ASCII的水平空格,即ox20
缩进
禁用缩进,推荐采用4个空格。
空格
- 左括号前需要添加空格
- 不推荐在多行赋值语句中对齐等号,虽然好看,然而在新增一条较长的赋值语句时,必须重新对齐之前所有语句。
- 如果大括号内容为空,则简洁写成
{}即可,大括号中间不需要换行和空格
空行
不同方法、不同逻辑、不同语义之间都可以适当增加空行。
换行与高度
换行
- 第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。
- 运算符与下文一起换行。
- 方法调用的点符号与下文一起换行。
- 方法调用中的多个参数需要换行时,在逗号后进行。
- 在括号前不要换行
StringBuilder sb = new StringBuilder();
sb.append("ma").append("chu")
.append("gao")
.append("xiao");
字符数/行数限制
- 单行字符数:120
- 单个方法行数:80
- 单个文件行数:2000
控制语句
- 在控制语句中必须使用大括号,即使只有一行代码
- 在条件表达式中不允许有赋值操作,不允许有判别表达式中出现复杂的逻辑组合
- 多层嵌套不能超过3层,如果超过,可使用卫语句、策略模式、状态模式等来实现。
- 避免采用反逻辑运算
注释
注释三要素:
- Noting is strange:不能完全没有注释
- Less is more:真正好的代码是自注释的,泛滥的注释影响可读性
- Advance with the times:注释应随代码的修改而修改,最忌讳注释反而误导理解。