Java学习之编程规范(一)

参考自阿里巴巴java开发手册v1.3.0终极版,对自己进行学习过程中的代码格式规范

编程规约

一.命名风格

  1. 【强制】代码中命名不能以下划线或美元符号开头或结尾
  2. 【强制】代码中严禁使用拼音和英文混合方式,要使用正确的英文拼写
  3. 【强制】类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下形式除外:DO/BO/DTO/VO/AO
  4. 【强制】方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式。
  5. 【强制】常量命名全部大写,单词用下划线隔开,力求语意表达清楚
  6. 【强制】抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开头,以Test结尾。
  7. 【强制】中括号是数组类型的一部分,数组定义如下:String[] args;
  8. 【强制】包名一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但类名如果有复数含义,类名可以使用复数形式。
  9. 【强制】杜绝完全不规范的缩写,避免望文不知意。

二.常量定义

  1. 【强制】不允许任何未经定义的常量直接出现在代码中。
  2. 【强制】Long或long初始赋值时,使用大写的L,不能是小写的l,小写的容易和数字1混淆,造成误解。

三.代码格式

  1. 【强制】大括号使用的约定。如果大括号内为空,则简洁的写成{}即可,不需要换行;如果是非空代码则:

    ​ 1)左大括号前不换行。

    ​ 2)左大括号后换行。

    ​ 3)右大括号前换行。

    ​ 4)右大括号后还有else等代码则不换行;表示终止的右大括号后必须换行。

  2. 【强制】左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格。

  3. 【强制】if/for/while/switch/do等保留字与括号之间都必须加空格。

  4. 【强制】任何二目、三目运算符的左右两边都需要加一个空格。

  5. 【强制】采用4个空格缩进,禁止使用Tab

    如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时,
    请勿勾选 Use tab character ;而在 eclipse 中,必须勾选 insert spaces for tabs 。

  6. 【强制】注释的双斜线和注释内容之间有且仅有一个空格。

  7. 【强制】单行字符数限制不超过120个,超出需要换行,不再继续缩进。

    1) 第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。
    2 ) 运算符与下文一起换行。
    3 ) 方法调用的点符号与下文一起换行。
    4 ) 方法调用时,多个参数,需要换行时,在逗号后进行。

  8. 【强制】方法参数在定义和传入时,多个参数逗号后面都必须加空格。

四.OOP规约

  1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可

  2. 【强制】所有的覆写方法,必须加@ Override 注解。

  3. 【强制】相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object 。

  4. 【强制】外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加@ Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。

  5. 【强制】不能使用过时的类或方法。

    java . net . URLDecoder 中的方法 decode(String encodeStr) 这个方法已经过时,应该使用双参数 decode(String source, String encode) 。接口提供方既然明确是过时接口,那么有义务同时提供新的接口 ; 作为调用方来说,有义务去考证过时方法的新实现是什么。

  6. 【强制】 Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals 。

    正例:" test " .equals(object);
    反例: object.equals( " test " );
    说明:推荐使用 java . util . Objects # equals(JDK 7 引入的工具类 )

  7. 【强制】所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。

    对于 Integer var = ? 在-128 至 127 范围内的赋值, Integer 对象是在IntegerCache . cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。

  8. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。

  9. 【推荐】 setter 方法中,参数名称与类成员变量名称一致, this .成员名 = 参数名。在getter / setter 方法中,不要增加业务逻辑,增加排查问题的难度。

五.集合处理

  1. 【强制】关于 hashCode 和 equals 的处理,遵循如下规则:

    1) 只要重写 equals ,就必须重写 hashCode 。
    2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。
    3) 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals 。

  2. 【强制】 ArrayList 的 subList 结果不可强转成 ArrayList 。

  3. 【强制】在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均会产生ConcurrentModificationException 异常。

  4. 【强制】使用集合转数组的方法,必须使用集合的 toArray(T【】 array) ,传入的是类型完全一样的数组,大小就是 list . size() 。

  5. 【强制】使用工具类 Arrays . asList() 把数组转换成集合时,不能使用其修改集合相关的方法。

  6. 【强制】泛型通配符<? extends T >来接收返回的数据,此写法的泛型集合不能使用 add 方法,而 <? super T> 不能使用 get 方法,做为接口调用赋值时易出错。

  7. 【强制】不要在 foreach 循环里进行元素的 remove / add 操作。 remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。

posted @ 2020-04-16 18:10  麻雀麻雀  阅读(289)  评论(0)    收藏  举报