阿里巴巴java开发手册学习记录

良好的开发规范会让代码简洁,可读性强,最后甚至一个小组的的代码你根本分辨不出来是谁写的,因为风格是一致的,这样也可以增强协同性。最近在学习阿里的java卡发开发手册,我摘录了一些自己遇到的用的比较多的地方做了记录 一.命名规范 1.驼峰命名:严禁拼音英文混搭。常量用_下划线拼接,比如:MAX_STOCK_COUNT 2.类名也遵循驼峰命名,但是特殊的也可以,比如:UserVO 3.POJO中boolean类型的变量一律 不要加is 反例:Boolean isDeleted 会引起序列化错误。 (数据库表示“是”,“否”的字段要加is 但是POJO不可以,后面会有介绍) 4.杜绝不规范的缩写 5.接口里面不要加修饰(public也不要) 比如:void f(); 6.Service/Dao层方法规范 获取单个对象:get开头 获取多个对象:list开头 获取统计值:count开头 插入的方法:save开头(insert) 删除的方法:remove开头(delete)
二.常量定义 1.long或者Long初始化时,必须使用大写的L,小写的l容易跟数字1混淆
三.代码格式 1.大括号{}内容为空的话不需要换行 2.缩进 4个空格 不用tab,如果用,必须设置成4个空格(个人觉得很多好像都是直接用tab) 阿里巴巴java开发手册学习记录
文章图片

阿里巴巴java开发手册学习记录
文章图片
四.OOP规范 1.访问一个类的静态变量或者静态方法,不要通过new对象方式,直接通过类名(点)的方式 2.Object的equals()方法容易NPE,应该用常量或者确定的值来调用equals()方法。 阿里巴巴java开发手册学习记录
文章图片
阿里巴巴java开发手册学习记录
文章图片

阿里巴巴java开发手册学习记录
文章图片

阿里巴巴java开发手册学习记录
文章图片
3. 强制:所有的POJO类属性都必须要使用包装数据类型 4.强制:构造方法里面禁止加入任何业务逻辑,如果需要请在init()方法中 5.POJO类必须要有toString()方法,便于排查错误(我目前都没加,极个别测试需要验证的才加了)
五.集合处理 1.关于hashCode()和equals() 1.1:重写了hashCode必须重写equals 1.2:set存储的是不重复的对象,所以set存储的对象必须重写这两个方法 1.3:自定义对象作为map的键,必须重写hashCode()和equals(),String已经默认重写了,所以可以直接作为map的key使用 2.集合转数组: List list=new ArrayList(2); list.add("a"); list.add("b"); String[] array=new String(list.size()); arrsy=list.toArray(array); toArray()方法参数传的就是数组,数组大小就是list.size(); 不能直接使用toArray()无参方法,无参方法返回的是Object[]类 3.数组转集合:Arrays.asList( )方法不能使用add/remove/clear方法。asList()返回的对象是一个Arrays的内部了类,没有实现集合的修改方法,后台数据仍是数组。 String[] str=new String[]{"a","b"}; List list=Arrays.asList(str); 3.1 list.add("c")会抛出运行时异常。 3.2 str[0]="xxxx"; 那么list.get(0)也会更改 4.不能再foreach循环里面进行remove操作,可以在Iterator里面remove(); 贴一个链接: http://www.jianshu.com/p/724f763fd242 里面介绍的比较好 当集合使用Iterator进行迭代的时候,实际是new Itr()创建一个内部对象,初始化包含对象个数,可以理解为在独立线程中操作的。Iterator创建之后引用指向原来的集合对象。当原来的对象数量发生变化时,这个内部对象索引表内容其实是不会同步的。所以,当索引指针往后移动的时候就找不到要迭代的对象了。内部对象操作时为了避免这种情况都会通过checkForComodification方法检测是否一致,不一致提前抛出异常ConcurrentModifiedException。
解决办法: Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException ,这个异常顾名思意:当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的 remove() 方法是个安全的做法。 阿里巴巴java开发手册学习记录
文章图片


阿里巴巴java开发手册学习记录
文章图片
List a=new ArrayList(); a.add("a"); a.add("b"); a.add("c"); a.add("d"); a.add("e"); Iterator iterator=a.iterator(); while (iterator.hasNext()) { String empString=iterator.next(); if("c".equals(empString)){ iterator.remove(); } } /*for(String emp:a){ if("e".equals(emp)){ a.remove(emp); } }*/ System.out.println(a); 5.使用entrySet遍历Map的 K ,V效率更高 Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); }
六.并发处理 这部分知识在工作中目前暂未涉及,以后涉及了再补上
七.控制语句 超过三层的if...else if()...else()...为了便于维护用卫语句 阿里巴巴java开发手册学习记录
文章图片
阿里巴巴java开发手册学习记录
文章图片


八.注释规约 1.强制:类,类属性,类方法的注释必须使用javadoc规范注释 /** 内容 */,不可以使用//方式 2.所有的抽象方法(包括接口中的方法)必须要用javadoc注释 3.强制:所有类都必须加创建者和创建日期 4.方法 内部 单行注释 用 // 方法内部多行注释 用/* 内容 */ 5.特殊注释标记: TODO(待办事宜)(标记人,标记时间,【预处理时间】) TODO是一个javadoc标签,所以只能用在类,接口,和方法上 FIXME(错误,不能工作)(标记人,标记时间,【预处理时间】)

九.其他 1.后台输送给页面的变量必须加 $!{var}中间的感叹号 2.Math.random()返回的是double类型,取值范围是0<= x<1,如果想获得整数类型的随机数,不要将x放大10的若干倍后取整,直接使用Random对象的nextInt或者nextLong方法。 3.获取当前的毫秒数用 System.currentTimeMillis();
十.异常处理 1.有一些runtimeException可以通过预先检查避免,比如: if(obj!=null){ } 2.要防止NPE 防止NPE是程序员的基本修养。NPE产生的场景:①返回类型为包装数据类型,有可能是null,返回int值时注意判空;②数据库的查询结果可能为null;③集合里的元素即使isNotEmpty,取出的数据元素也可能为null;④远程调用返回对象,一律要求进行NPE判断;⑤对于Session中获取的数据,建议NPE检查避免空指针;⑥级联调用obj.getA().getB().getC()易产生NPE;

十一.数据库部分 1.【强制】不要使用 count(列名)或count(常量)来替代count(*),count(*)就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非 NULL 无关。 说明: count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。 2.【强制】count(distinct col)计算该列除NULL之外的不重复数量。注意count(distinct col1,col2)如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。 3.【强制】当某一列的值全是 NULL时, count(col)的返回结果为0,但sum(col)的返回结果为NULL ,因此使用sum()时需注意NPE问题。 正例: 可以使用如下方式来避免sum的 NPE 问题:SELECT IF( ISNULL (SUM(g)),0,SUM(g)) FROM tableName 4.【强制】使用 ISNULL() 来判断是否为 NULL 值。注意: NULL 与任何值的直接比较都为 NULL 。 说明:

  1. 1)NULL<>NULL的返回结果是NULL,不是false。
  2. 2)NULL=NULL的返回结果是NULL,不是true。
  3. 3)NULL<>1的返回结果是NULL,而不是true。
5.【强制】在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。

十二.ORM映射 1.【强制】在表查询中,一律不要使用*作为查询的字段列表,需要哪些字段必须明确写明。 说明: 1)增加查询分析器解析成本。2)增减字段容易与resultMap配置不一致。 2.【强制】POJO 类的 boolean 属性不能加 is,而数据库字段必须加is_,要求在resultMap 中进行字段与属性之间的映射。 说明: 参见定义POJO类以及数据库字段定义规定,在sql.xml增加映射,是必须的。 3.【强制】不要用 resultClass当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义; 反过来,每一个表也必然有一个与之对应。 说明: 配置映射关系,使字段与DO类解耦,方便维护。 4.【强制】xml 配置中参数注意使用:#{},#param#不要使用${}此种方式容易出现 SQL注入。 5.【强制】iBATIS 自带的 queryForList(String statementName,int start,int size)不推荐使用。 说明: 其实现方式是在数据库取到statementName对应的SQL 语句的所有记录,再通过subList取start,size 的子集合,线上因为这个原因曾经出现过OOM。 6.【推荐】不要写一个大而全的数据更新接口,传入为 POJO类,不管是不是自己的 目标更新字段 ,都进行update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行SQL时,尽量不要更新无改动的字段,一是易出错; 二是效率低; 三是binlog增加存储。 7.【参考】中的compareValue是与属性值对比的常量,一般是数字,表示相等时带上此条件;表示不为空且不为null时执行; 表示不为null值时执行。




    推荐阅读