阿里巴巴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)

四.OOP规范
1.访问一个类的静态变量或者静态方法,不要通过new对象方式,直接通过类名(点)的方式
2.Object的equals()方法容易NPE,应该用常量或者确定的值来调用equals()方法。


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<String> list=new ArrayList<String>(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() 方法是个安全的做法。


List<String> a=new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");
a.add("d");
a.add("e");
Iterator<String> 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()...为了便于维护用卫语句


八.注释规约
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.【参考】<isEqual>中的compareValue是与属性值对比的常量,一般是数字,表示相等时带上此条件;<isNotEmpty>表示不为空且不为null时执行;<isNotNull>表示不为null值时执行。





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值