美文网首页
阿里开发手册(一)

阿里开发手册(一)

作者: Jaden_1eaa | 来源:发表于2018-11-20 17:41 被阅读0次

## 强制:

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

>例如:

内部类编译之后a$b

dbcp2中的变量全部都是_开头

- 起名不能用中文,英文和拼音混搭风也不允许 例如:getPingFenByName

- 类名使用大驼峰方式,帕斯卡命名法

- 命名要全大写单词用下划线分开,不要缩写,尽量表达准确意思。 MAX_STOCK_COUNT VS MAX_COUNT

- 类名的要分类:

>  抽象类: Abstract 或者 Base 开头

>  异常类:以Exception结尾

测试类:以Test 结尾

demo code :

  ```java

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、初始化:对静态变量,静态代码块执行初始化工作

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

      >避免:getObject get0bject的问题出现

3. 尽量不用可变参数。

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

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

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

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

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

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

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

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

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

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

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

- 集合:

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

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

    3. ArrayList 的 subList 不可强转成ArrayList

>ArrayList的subList方法 返回的是一个SubList对象。

SubList是ArrayList的一个内部类,所以我们并不能写如下代码:

```java

ArrayList originalList = new ArrayList(10);

ArrayList subList = originalList.subList(2, 5);

```

    4. 在subList使用时一定要注意,对原集合的修改,会导致ConcurrentModificationException.

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

        For example:

        ```java

        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()

        例子:

          ```java

          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对象加锁

反例:

```java

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

相关文章

网友评论

      本文标题:阿里开发手册(一)

      本文链接:https://www.haomeiwen.com/subject/yjhtqqtx.html