实在是不想捏着鼻子看代码了
版权信息
作者信息
命名
- 拼写正确
- 词性
- 属性和类:名词
- 方法:动词
- 有语义
- 专业词汇
- 清晰、精准
- 无歧义
- 集合
- 统一使用复数形式,如果将来类型发生变化,不会影响名称的修改
- 重要细节
- 时间常量带单位
可读性
采用正向思维
- 例如场景是集合有数据时做一些事情,可以判断集合为空时直接返回(取决于具体业务场景)
方法要短小精悍
- 缩小变量的作用域
- 就近原则:在使用的上一句进行声明
- try-catch语句块包裹时,在try内直接返回正常值,不要把
return
写在最后
- 在保证可读性的前提下,尽可能少声明变量
- 如果变量只使用一次,那就把赋值语句直接写到变量使用的地方
方法
- 将子问题抽象为独立的方法
- 保证抽象级别一致
- 相同逻辑的代码抽象为方法,代码复用
- 如果是多层方法调用
- 如果是下层方法使用参数,直接将原参数直接传递给下层,到具体使用时再获取
- 参数顺序要保持一致
返回值
- 类型定义
- 集合类型:如果数据库没有查询到值,就new一个空集合Safes.of()包装一下
- 对象类型:接口定义改为Optional,返回值使用Optional.of()包装,Optional使用guava的(实现了序列化)
- 执行保存的方法统一返回主键值
- 类型定义
注释
- FIXME与TODO
- FIXME
- 临时代码
- 错误代码
- TODO
- 待实现
- FIXME
- FIXME与TODO
依赖
模块依赖
- 下层不可以引用上层的类
项目依赖
- dubbo接口需要注意循环依赖
getter/setter
- 采用build模式
command+N
->Getter and Setter
->Setter template
->Builder
- 采用build模式
日志
- 关键操作写日志
- 日志级别
- 打印参数用
debug
- 打印参数用
单元测试
- 单元测试的包路径和实现的包路径要保持一致
数据删除
- 严谨物理删除,统一采用逻辑删除
其它
- 接口中不要有enum,如果一定要用,需要保证不会变,可以写明范围
- 将相同的操作提取为工具类
Guava
只获取集合中第0个值,可以用Guava的
Iterators.getOnlyElement(iterator)
- 确保集合内只有一个值,当大于一个值时会报错
排序可以用guava的Ordering.natural或Java 8的Comparator
- 保存对应关系的Map如果值是固定的,可以采用Guava的
ImmutableMap
类
- 工具类
- 如果是设置值,命名可以采用
writeXXX
- 参考FieldUtils.writeField
- 方法参数可以多样化
- 如果是读取文件,入参可以为文件路径,流数据等
- 如果是设置值,命名可以采用
- 普通类
- 尽量不要有类变量,如果有,要确保不变,否则会引起多线程问题
- 使用的值如果范围仅限于某几个方法,并且是会变化的值,可以作为方法参数由外部传值
- 工具类
性能
- 算法复杂度
- 尽可能将循环次数减少
- 例如循环某个list,判断当前一条的某个值等于固定值时采取操作,可以替换为先将list转为以判断的值为key的map,直接根据固定值从map中取到对应的信息,从而避免无效的循环次数
- 尽可能将循环次数减少
- 算法复杂度
三方工具
java 8
- Java8中新特性使用比较多的是collection与stream的结合。
Guava
- Splitter
- Joiner
- Lists,
- Maps
- Sets,
- Multimap
- Rangexxx
- Table
- ImmuableXXX
- Collections2
- Preconditions
- FluentIterable
- Files(可选)
Apache common lang3
- StringUtils
- NumberUtils
Apache collection4
- ListUtils
- CollectionUtils
- MapUtils
- SetUtils
使用场景
- 建议先使用java8 stream处理,如果stream没有合适的工具,然后从guava和apache中查找有没有合适的工具。