(1)常量的定义

    【强制】在long或者Long赋值时,数值后使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。

   说明:Long a = 2l; 写的是数字的21,还是Long型的2?

(2)代码格式

public static void main(String[] args) {
    // 缩进4个空格
    String say = "hello";
    // 运算符的左右必须有一个空格
    int flag = 0;
    // 关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格
    if (flag == 0) {
        System.out.println(say);
    }
    // 左大括号前加空格且不换行;左大括号后换行
    if (flag == 1) {
       System.out.println("world");
    // 右大括号前换行,右大括号后有else,不用换行
    } else {
       System.out.println("ok");
    // 在右大括号后直接结束,则必须换行
    }
}

【强制】注释的双斜线与内容之间有且仅一个空格。

正例:

// 这是示例注释,请注意在双斜线之后有一个空格

String ygb = new String();

7. 【强制】单行字符数限不超过 120 个,超出需要换行时 个,超出需要换行时 遵循如下原则:

1) 第二行相对一缩进 4个空格,从第三行开始不再继续缩进参考示例。

2) 运算符与下文一起换行。

3) 方法调用的点符号与下文一起换行。

4) 方法调用中的多个参数需要换行时,在逗号后进行。

5) 在括号前不要换行,见反例。

正例:
StringBuffer sb = new StringBuffer();
// 超过120个字符的情况下,换行缩进4个空格,点号和方法名称一起换行
sb.append("zi").append("xin")...
    .append("huang")...
    .append("huang")...
    .append("huang");
反例:
StringBuffer sb = new StringBuffer();
// 超过120个字符的情况下,不要在括号前换行
sb.append("zi").append("xin")...append
    ("huang");
// 参数很多的方法调用可能超过120个字符,不要在逗号前换行
method(args1, args2, args3, ...
    , argsX);

(3)OOP 规约

1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。

6. 【强制】Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。

正例:"test".equals(object);

反例:object.equals("test");

说明:推荐使用java.util.Objects#equals(JDK7引入的工具类)

7. 【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。

说明:对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。

10. 【强制】序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。 说明:注意serialVersionUID不一致会抛出序列化运行时异常。
12. 【强制】POJO类必须写toString方法。使用IDE中的工具:source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。 说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。

14. 【推荐】使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException的风险。
说明:
String str = "a,b,c,,";
String[] ary = str.split(",");
// 预期大于3,结果是3
System.out.println(ary.length);

18. 【推荐】循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展。 说明:下例中,反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费。
反例:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}

21. 【推荐】类成员与方法访问控制从严:

1) 如果不允许外部直接通过new来创建对象,那么构造方法必须是private。

2) 工具类不允许有public或default构造方法。

3) 类非static成员变量并且与子类共享,必须是protected。

4) 类非static成员变量并且仅在本类使用,必须是private。

5) 类static成员变量如果仅在本类使用,必须是private。

6) 若是static成员变量,考虑是否为final。

7) 类成员方法只供类内部调用,必须是private。

8) 类成员方法只对继承类公开,那么限制为protected。

说明:任何类、方法、参数、变量,严控访问范围。过于宽泛的访问范围,不利于模块解耦。思考:如果是一个private的方法,想删除就删除,可是一个public的service成员方法或成员变量,删除一下,不得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域太大,无限制的到处跑,那么你会担心的。

 

(4)集合处理

5. 【强制】使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。 说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。

    String[] str = new String[] { "you", "wu" };

    List list = Arrays.asList(str);

    第一种情况:list.add("yangguanbao"); 运行时异常。

    第二种情况:str[0] = "gujin"; 那么list.get(0)也会随之修改。

11. 【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。

    说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。

    正例:values()返回的是V值集合,是一个list集合对象;keySet()返回的是K值集合,是一个Set集合对象;entrySet()返回的是K-V值组合集合。
阿里巴巴java开发手册摘录
阿里巴巴java开发手册摘录

(5)控制语句

阿里巴巴java开发手册摘录

 

(6)注释规约

阿里巴巴java开发手册摘录

(7)其他

阿里巴巴java开发手册摘录

阿里巴巴java开发手册摘录

阿里巴巴java开发手册摘录

 

(8)异常处理

阿里巴巴java开发手册摘录

阿里巴巴java开发手册摘录

 阿里巴巴java开发手册摘录

 

(9)数据库(mysql)

阿里巴巴java开发手册摘录

阿里巴巴java开发手册摘录

 阿里巴巴java开发手册摘录

 阿里巴巴java开发手册摘录

 

索引

 

 阿里巴巴java开发手册摘录

 阿里巴巴java开发手册摘录

 阿里巴巴java开发手册摘录

 阿里巴巴java开发手册摘录

 

SQL语句

阿里巴巴java开发手册摘录

阿里巴巴java开发手册摘录

阿里巴巴java开发手册摘录

 阿里巴巴java开发手册摘录

 ORM 映射

阿里巴巴java开发手册摘录

 

 

相关文章: