实在是不想捏着鼻子看代码了

  • 版权信息

  • 作者信息

  • 命名

    • 拼写正确
    • 词性
      • 属性和类:名词
      • 方法:动词
    • 有语义
      • 专业词汇
      • 清晰、精准
      • 无歧义
    • 集合
      • 统一使用复数形式,如果将来类型发生变化,不会影响名称的修改
    • 重要细节
      • 时间常量带单位
  • 可读性

    • 采用正向思维

      • 例如场景是集合有数据时做一些事情,可以判断集合为空时直接返回(取决于具体业务场景)
    • 方法要短小精悍

    • 缩小变量的作用域
      • 就近原则:在使用的上一句进行声明
      • try-catch语句块包裹时,在try内直接返回正常值,不要把return写在最后
    • 在保证可读性的前提下,尽可能少声明变量
      • 如果变量只使用一次,那就把赋值语句直接写到变量使用的地方
  • 方法

    • 将子问题抽象为独立的方法
    • 保证抽象级别一致
    • 相同逻辑的代码抽象为方法,代码复用
    • 如果是多层方法调用
      • 如果是下层方法使用参数,直接将原参数直接传递给下层,到具体使用时再获取
      • 参数顺序要保持一致
  • 返回值

    • 类型定义
      • 集合类型:如果数据库没有查询到值,就new一个空集合Safes.of()包装一下
      • 对象类型:接口定义改为Optional,返回值使用Optional.of()包装,Optional使用guava的(实现了序列化)
    • 执行保存的方法统一返回主键值
  • 注释

    • FIXME与TODO
      • FIXME
        • 临时代码
        • 错误代码
      • TODO
        • 待实现
  • 依赖

    • 模块依赖

      • 下层不可以引用上层的类
    • 项目依赖

      • dubbo接口需要注意循环依赖
  • getter/setter

    • 采用build模式
      • command+N -> Getter and Setter -> Setter template -> Builder
  • 日志

    • 关键操作写日志
    • 日志级别
      • 打印参数用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中查找有没有合适的工具。