解析阿里java编程规范

来源:互联网 发布:java执行git命令 编辑:程序博客网 时间:2024/06/06 19:40

一些没有没有说明的规范,在这里解析一下,也方便自己的理解。

一、编程规约

  1. 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。

    解析:因为系统底层的一些代码会包含_或者$,用这个开头或者结尾容易产生一些不容易排查的冲突。

  2. 【强制】 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

    反例: DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3

    正例: alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。

    解析:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式 也要避免采用。

  3. 【强制】中括号是数组类型的一部分,数组定义如下:String[] args; 反例:请勿使用String args[]的方式来定义。

    解析:因为通过“类型 + 变量名”的方式更加容易理解,而中括号属于数组类型的一部分。

  4. 【强制】不允许出现任何魔法值(即未经定义的常量)直接出现在代码中。

    反例: String key=”Id#taobao_”+tradeId;cache.put(key, value);

    解析:因为直接使用魔法值,别人不能很直接的看到该常量的含义。

  5. 【强制】缩进采用 4 个空格,禁止使用 tab 字符。

    解析:因为不同编译器对tab的解析可能不一样,混用的话就不易于查看。

  6. 【强制】IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式, 不要使用 windows 格式。

    解析:这是为了保持代码在不同平台的都可以保持良好的格式。

  7. 【强制】相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。

    解析:可变参数虽然使用方便,但是在大型项目中可读性和可维护性就变得很差了。

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

    正例: “test”.equals(object);

    反例: object.equals(“test”);

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

    **解析:**Objects.equals(a,b)的使用就完全可以避免空指针异常了,但是如果a和b都为null的话,返回true。

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

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

    解析:其实上面已经说得很清楚了,当Integer包装类在-128到127之间,直接指向缓冲池,超过这个范围会重新创建对象,所以==是不相等的。

  10. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。

    解析:当构造方法加入逻辑之后,这个对象的重新性就被大大降低了。

  11. 【推荐】慎用 Object 的 clone 方法来拷贝对象。

    说明:对象的 clone 方法默认是浅拷贝,若想实现深拷贝需要重写 clone 方法实现属性对象 的拷贝。

    解析: 浅拷贝,即仅拷贝对象中基本数据类型的成员属性,如果成员属性引用了其他对象,则拷贝出的对象副本中的这些成员属性引用的还是同一个对象。深拷贝则是被拷贝对象的成员属性引用的其他对象也是拷贝出的副本。

  12. 【强制】关于 hashCode 和 equals 的处理,遵循如下规则:

    1) 只要重写equals,就必须重写hashCode。

    2) 因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的 对象必须重写这两个方法。

    3) 如果自定义对象做为Map的键,那么必须重写hashCode和equals。

    正例:String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象 作为 key 来使用。

    解析:因为hashCode和equals是配合起来使用的,先定位对象的hash值链表,在equals对象才能唯一标识对象。

编辑到这我发现了有人已经做了这件事了,而且感觉做得挺好,我就不继续写了。

点击这里传送门

原创粉丝点击