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

时间:2021-03-26 03:26:45
良好的开发规范会让代码简洁,可读性强,最后甚至一个小组的的代码你根本分辨不出来是谁写的,因为风格是一致的,这样也可以增强协同性。最近在学习阿里的java卡发开发手册,我摘录了一些自己遇到的用的比较多的地方做了记录 一.命名规范1.驼峰命名:严禁拼音英文混搭。常量用_下划线拼接,比如:MAX_STOCK_COUNT2.类名也遵循驼峰命名,但是特殊的也可以,比如:UserVO3.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必须重写equals1.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() 方法是个安全的做法。阿里巴巴java开发手册学习记录

阿里巴巴java开发手册学习记录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()...为了便于维护用卫语句阿里巴巴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 tableName4.【强制】使用 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值时执行。