阿里巴巴java手册首记

主要记一下平时不注意的点

java篇

  1. pojo中的成员变量必须是包装类属性

  2. pojo中都要有toString方法

  3. pojo 类中布尔类型的变量,都不要加 is

  4. 方法参数中的可变参数(…)要放在其他参数的最后

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Varargs {
    public static void test(String... args) {
    for(String arg : args) {
    System.out.println(arg);
    }
    }
    public static void main(String[] args) {
    test();//0个参数
    test("a");//1个参数
    test("a","b");//多个参数
    test(new String[] {"a", "b", "c"});//直接传递数组
    }
    }
  5. long b = 4L; 符号标记要大写,因为字体l1很像

  6. method(“a”, “b”, “c”);方法参数书写格式要注意逗号后空一格

  7. 代码格式中缩进要4 个空格,不要2个空格

  8. 在pojo的方法中应遵守下面的规范

    1. 获取单个对象的方法用get做前缀
    2. 获取多个对象的方法用list做前缀
    3. 获取统计值的方法用count做前缀
    4. 插入的方法用save(推荐)或insert做前缀
    5. 删除的方法用remove(推荐)或delete做前缀
    6. 修改的方法用update做前缀
  9. 数据传输对象取名:xxxDTO,之前我没写DTO后缀,下次记住

  10. 用设计模式时,需要把类名给体现出来,如下

    1
    2
    3
    public class OrderFactory;
    public class LoginProxy;
    public class ResourceObserver;
  11. 使用常量的equals方法,可以防止空指针问题:"1".equals(temp)

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

    1
    2
    3
    4
    5
    6
    7
    Iterator<String> it = a.iterator(); 
    while(it.hasNext()){
    String temp = it.next();
    if(删除元素的条件){
    it.remove();
    }
    }
  13. 在做抽象接口中,可以利用泛型把抽象更深化

    1
    2
    3
    public interface Info<T> {
    public T getVar();
    }
  14. 使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历,前面这种是一遍循环,后面两遍

  15. 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程

  16. SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用 DateUtils 工具类

    1
    2
    3
    4
    5
    6
    private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { 
    @Override
    protected DateFormat initialValue() {
    return new SimpleDateFormat("yyyy-MM-dd");
    }
    };
  17. 并发修改同一记录时,避免更新丢失,要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用 version 作为更新依据

  18. Math.random() 这个方法返回是 double 类型,注意取值的范围 0≤x<1(能够 取到零值,注意除零异常),如果想获取整数类型的随机数,不要将 x 放大 10 的若干倍然后 取整,直接使用 Random 对象的 nextInt 或者 nextLong 方法
  19. 获取当前毫秒数 System.currentTimeMillis(); 而不是 new Date().getTime();
  20. 异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低
  21. 不能在 finally 块中使用 return,finally 块中的 return 返回后方法结束执行,不 会再执行 try 块中的 return 语句

mysql篇

  1. 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint ( 1表示是,0表示否),此规则同样适用于odps建表
  2. 唯一索引名为 uk_字段名;普通索引名则为 idx_字段名
  3. 表名、字段名必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只出现数字
  4. 小数类型为 decimal,禁止使用 float 和 double
  5. 如果存储的字符串长度几乎相等,使用 char 定长字符串类型
  6. varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率
  7. 不要使用 count(列名)或 count(常量)来替代 count(*),count(*)就是 SQL92 定义 的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关
  8. 不得使用外键与级联,一切外键概念必须在应用层解决
  9. 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性(不用学存储过程好开心)
  10. in 操作能避免则避免,若实在避免不了,需要仔细评估in 后边的集合元素数量,控制在 1000 个之内
  11. pojo 类的 boolean 属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中 进行字段与属性之间的映射

其实我还有一些没记下,因为完全没接触过。。尴尬,还是要继续学习