一.命名规范
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 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() 方法是个安全的做法。
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()...为了便于维护用卫语句
八.注释规约
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) NULL<>NULL的返回结果是NULL,不是false。
- 2) NULL=NULL的返回结果是NULL,不是true。
- 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值时执行。