java 代码规范

java 代码规范

参考

源文件组织结构

  • 源文件必须按顺序由以下部分组成:
    • 许可证(License)或版权声明(Copyright)
    • package语句
      • package语句占据单独一行不换行,允许超出120字符列宽限制。
    • import语句
      • 非static imports,禁止使用通配符import。
      • 所有未使用的import语句应该被删除。
    • 唯一的顶层类
      • 每个源文件只允许包含唯一一个顶层类。
      • 重载的方法必须放在一起,即同名的构造函数或方法之间禁止插入其他成员。
    • 每两部分之间用一个空行分隔,不允许多个空行。

代码格式

  • 每行只写一条语句, 每条语句之后都要换行。
  • 在类的不同的成员间增加空行,包括:成员变量、构造函数、方法、内部类、静态初始化块、实例初始化块等.
  • 两个成员变量声明之间可以不加空行。空行通常用于对成员变量进行逻辑分组。
  • 方法体内,按需增加空行,以便从逻辑上对语句进行分组
  • 除行首缩进、注释和字符串内的空格以外,禁止使用连续的空格
  • 类型与中括号紧挨相连来 表示 数组。用String[] args的方式来声明数组,而非String args[]。
  • 添加在类、方法、构造函数、成员属性上的注解(Annotation)直接写在注释块之后,每个注解独占一行。
  • 当同时使用多个修饰符时,按照下列顺序:
    • public protected private abstract static final transient volatile synchronized native strictfp
  • 长整型数字必须使用大写字母L结尾,不能使用小写字母l,以便和数字1进行区分。例如使用3000000000L而不是3000000000l

命名

  • 通常有多种方式将短语组织成驼峰方式,像一些缩写词:IPv6、iOS等。为了统一,必须遵循以下几点规则。
    • 将字符全部转换为ASCII字符,并且去掉’等符号。例如,Müller's algorithm被转换为Muellers algorithm
    • 在空格和标点符号处对上一步的结果进行切分,组成一个词组。

编程实践

  • 关于基本数据类型与包装数据类型的使用标准如下:
    • 所有的 POJO 类(普通定义的类)属性必须使用包装数据类型。
    • RPC 方法的返回值和参数必须使用包装数据类型。
    • 所有的局部变量使用基本数据类型。
  • 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
  • 所有的覆写方法,必须加@Override 注解。
  • 相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。
  • 不能使用过时的类或方法。
  • Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。
  • 所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。
  • 定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
  • 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
  • POJO 类必须写 toString 方法。
  • 禁止覆盖(Override)Object.finalize方法。
  • 关于 hashCode 和 equals 的处理,只要重写 equals,就必须重写 hashCode。
  • ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。在 subList 场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍历、 增加、删除产生 ConcurrentModificationException 异常。
  • 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
  • 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
  • 类、类属性、类方法的注释必须使用 Javadoc 规范,使用/** 内容 **/格式,不得使用 // xxx 方式。
  • 异常不要用来做流程控制,条件控制。
  • catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。 对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。
  • 捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请 将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
  • 有 try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回 滚事务。
  • finally 块必须对资源对象、流对象进行关闭,有异常也要做 try-catch。 说明:如果 JDK7 及以上,可以使用 try-with-resources 方式。
  • 不要在 finally 块中使用 return。
  • 捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。
posted @ 2020-03-22 16:58  coding-for-self  阅读(742)  评论(0编辑  收藏  举报