开发手册

强制:

  • 不能以下划线美元字符开头和结尾 _name, n a m e , n a m e , n a m e name, name_, name 都是不允许的。 jvm底层的一些代码是以这种方式命名的

例如:
内部类编译之后a$b
dbcp2中的变量全部都是_开头

  • 起名不能用中文,英文和拼音混搭风也不允许 例如:getPingFenByName
  • 类名使用大驼峰方式,帕斯卡命名法
  • 命名要全大写单词用下划线分开,不要缩写,尽量表达准确意思。 MAX_STOCK_COUNT VS MAX_COUNT
  • 类名的要分类:

抽象类: Abstract 或者 Base 开头
异常类:以Exception结尾
测试类:以Test 结尾

demo code :


abstract class BaseAttachment extends NewBasePO

  • POJO类中布尔变量,都不要加is. 否则部分框架会引起序列化错误

    案例:
    SpringMVC 如果model类里定义了boolean 属性,会导致前后台传值不一致
    定义基本数据类型 Boolean isDeleted, RPC框架在反向解析时以为对应的属性名是deleted.

  • 包名统一使用小写。类有复数含义时可以定义为复数形式

  • 如果模块、接口、类、方法使用了设计模式,在命名时要体现具体模式

    如: OrderFactory. LoginProxy

  • 尽量不要在接口中定义变量,如果一定要定义接口变量,则一定要与接口方法相关,且是整个应用的基础变量.接口中的方法和属性不要加任何修饰符,否则编译报错,在idea中如果添加修饰符会提示错误。

  • 参考 各层命名规约:

    1. 获取单个对象用get做前缀

    2. 获取多个对象用list做前缀

    3. 获取统计值的方法用count做前缀

    4. 插入的方法用save/insert做前缀

    5. 删除的方法用remove/delete做前缀

    6. 修改的方法用update做前缀

  • 领域模型命名规约:

    1. 数据对象 xxxDO xxx 指代表名

    2. 数据传输对象 xxxDTO xxx与业务相关的名字

    3. 展示对象 xxxVO xxx网页名称

    4. POJO时DO/DTO/BO(业务对象)/VO的统称。禁止命名为xxxPOJO

  • 常量定义:

    1. 不允许有任何未经定义的常量出现在代码中

    2. long或者Long赋值时,要用大写的L

    3. 不要使用一个巨大的常量类来维护所有的常量,按业务分开维护

    4. 如果常量值尽在一个范围内变化,且带有名称之外的延申属性,定义为枚举类。

  • OOP规约:

    1. 不要用一个类的实例调用静态方法或属性,这样会增加编译器的解析成本

      扩展:JVM类的加载顺序扩展:JVM类的加载顺序
      1、装载:查找和导入Class文件
      2、链接:其中解析步骤是可以选择的
      (a)检查:检查载入的class文件数据的正确性
      (b)准备:给类的静态变量分配存储空间
      (c)解析:将符号引用转成直接引用
      3、初始化:对静态变量,静态代码块执行初始化工作

    2. 所有的覆写方法必须加@Override注解

      避免:getObject get0bject的问题出现

    3. 尽量不用可变参数。

      在重视性能的情况下,使用可变参数机制要特别小心。可变参数方法的每次调用都会导致进行一次数组分配和初始化。另外如果客户端调用带有可变参数的方法时,没有传递参数进去,就会在运行时而不是编译时失败。

    4. 所有的相同类型的包装类对象之间的比较全部使用equals方法

    5. 关于基本数据类型与包装数据类型的使用标准如下

    6. 所有的POJO类属性必须使用包装数据类型

    7. RPC方法的返回值和参数必须使用包装类型

    8. 所有的局部变量使用基本数类型

    9. 定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。

    10. 构造方法里禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法里

    11. POJO类必须强制写toString方法。便于排查问题

    12. split方法得到数组时,需做最后一个分隔符后有无内容的检查

    13. 在setter和getter方法中尽量不要有业务逻辑

  • 集合:

    1. Set 必须重写hashCode 和 equals方法

    2. 如果自定义对象作为HashMap的键则必须重写hasnCode 和 equals 方法

    3. ArrayList 的 subList 不可强转成ArrayList

      ArrayList的subList方法 返回的是一个SubList对象。
      SubList是ArrayList的一个内部类,所以我们并不能写如下代码:

      ArrayList originalList = new ArrayList(10);
      ArrayList subList = originalList.subList(2, 5);
      
    4. 在subList使用时一定要注意,对原集合的修改,会导致ConcurrentModificationException.

      因为在每个subList的调用方法中都会做集合修改的判断 checkForComodification
      For example:

      public static void main(String[] args) {
          ArrayList all = new ArrayList();
          all.add(1);
          all.add(2);
          all.add(3);
      	all.add(4);
          all.add(5);
          List sub = all.subList(1, 4);
      
          for(Object item : sub) {
              sub.remove(item);
          }
      }```
      
      
    5. 集合转数组时要使用 T[] toArray(T[] array), 不要直接使用list.toArray()

      例子:

      ArrayList<String> list = new ArrayList<>();
      
      list.add(1);
      
      list.add(2);
      
      String[] strArray = new String[list.size()];
      
      strArray = list.toArray(strArray);
      

      思考为什么不使用toArray?

    6. 使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,add/remove/clear.否则会抛出UnsupportedOperationException。

      Arrays.asList() 放回的时Arrays的内部类ArrayList,其并未实现上述方法。

    7. 不要在foreach循环里进行元素的remove/add操作。remove元素时请使用Iterator, 如果并发操作需要对Iterator对象加锁
      反例:

      List<String> list = new ArrayList<String>();
      
      list.add("1");
      list.add("2");
      list.add("3");
      for(String item : list) {
          if("1".equals(item)) {
              list.remove(item);
          }
      }
      

      分析 1. add方法 modCount++, 初始化后和size相等2. remove 方法会修改 modCount++3. 在初始化迭代器时 会 将modCount 赋值给 expectedModCount4. 调用next方法时则会检查 modCount !== expectedModCount ==> exception throw

  • HashMap初始化时指定集合初始化大小

  • 遍历map时使用entitySet而不是keySet.减少遍历次数,提高性能

  • ArrayList order/unsort HashMap unorder/unsort TreeSet order/sort

  • java 1.7之后,实现Comparator需要考虑三个条件:

    1) x,y 的比较结果和 y,x 的比较结果相反。
    2) x>y,y>z,则 x>z。
    3) x=y,则 x,z 比较结果和 y,z 比较结果相同

    public int compare(String t1, String t2) {
         if (v1 < v2) {
             return -1;
         } else if (v1 > v2) {
             return 1;
         } else {
             return 0;
         }
     }
    

猜你喜欢

转载自blog.csdn.net/u014454462/article/details/84317511