阿里巴巴 Java 开发手册之编程规约(一)

  • 时间:
  • 浏览:0

使用/ /注释,注意与代码对齐。

反例:

// put elephant into fridge

put(elephant, fridge);

妙招 名 put,打上去有4个有意义的变量名 elephant 和 fridge,愿因说明了这是在干什么,语义清晰的代码不时需额外的注释。

public class LoginProxy; public class ResourceObserver;

说明:

反例: 愿因 HashMap 的干扰,但是人认为 ConcurrentHashMap 是可不利于够置入 null 值,注意存储 null 值时会抛出 NPE 异常。

正例:下例中实参的"a",上边时需要有有4个空格。 method("a", "b", "c");

int a = 3;

long b = 4L;

float c = 5F;

StringBuffer sb = new StringBuffer();

说明:增加 sb 其他变量,愿因时需对齐,则给 a、b、c 时会增加哪几条空格,在变量比较多的 情況下,是两种累赘的事情。

说明:愿因想获取更加精确的纳秒级时间值,用 System.nanoTime()。在 JDK8 中,针对统计时间等场景,推荐使用Instant 类。

说明:愿因使用 tab 缩进,时需设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时, 请勿勾选Use tab character ;而在 eclipse 中,时需勾选insert spaces for tabs。

反例: _name / __name / $Object / name_ / name$ / Object$

说明:String 重写了 hashCode 和 equals 妙招 ,但是大伙儿可不利于够非常愉快地使用 String 对象 作为 key 来使用。

1) 【强制】所有的POJO类属性时需使用包装数据类型。(我理解的但是正常封装的JAVA对象,只中有 get set妙招 的那种)

2) 【强制】RPC(远程过程调用协议)妙招 的返回值和参数时需使用包装数据类型。(其他人太好 越来越 ,按我的经验来说RPC接口最好并不一定用简单数据类型)

3) 【推荐】所有的局部变量使用基本数据类型。

说明:POJO 类属性越来越 初值是提醒使用者在时需使用时,时需当事人显式地进行赋值,任何NPE (空指针)问题报告 图片,愿因入库检查,都由使用者来保证。

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

反例: object.equals("test"); 说明:推荐使用java.util.Objects#equals (JDK7引入的工具类)

说明:Executors 返回的应用程序池对象的弊端如下:

1)FixedThreadPool 和 SingleThreadPool:

允许的请求队列长度为 Integer.MAX_VALUE,愿因会堆积几滴 的请求,从而愿因 OOM。

2)CachedThreadPool 和 ScheduledThreadPool:

允许的创建应用程序数量为 Integer.MAX_VALUE,愿因会创建几滴 的应用程序,从而愿因 OOM。

正例:接口妙招 签名:void f();

接口基础常量表示:String COMPANY = "alibaba";

反例:接口妙招 定义:public abstract void f();

说明:JDK8 中接口允许有默认实现,越来越 其他 default 妙招 ,是对所有实现类时会价值的默 认实现。

反例:

正例:数据库的查询结果愿因是 null,愿因自动拆箱,用基本数据类型接收有 NPE 风险。

反例:比如显示成交总额涨跌情況,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时,返回的是默认值,页面显示:0%,这是不合理的,应该显示成中划线-。但是包装 数据类型的 null 值,不利于表示额外的信息,如:远程调用失败,异常退出。

说明:在 IDE 编辑窗口中,Javadoc 妙招 会提示相关注释,生成 Javadoc 可不利于够正确输出相应注 释;在 IDE 中,工程调用妙招 时,不进入妙招 即可悬浮提示妙招 、参数、返回值的意义,提高 阅读波特率。

正例:注意应用程序安全,使用 DateUtils。

亦推荐如下处理:

private static final ThreadLocal df = new ThreadLocal() { @Override

protected DateFormat initialValue() {

return new SimpleDateFormat("yyyy-MM-dd");

} };

说明:愿因是 JDK8 的应用,可不利于够使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 Simpledateformatter,官方给出的解释:simple beautiful strong immutable thread-safe。

说明:公有妙招 是类的调用者和维护者最关心的妙招 ,首屏展示最好;保护妙招 人太好 但是子类 关心,也愿因是“模板设计模式”下的核心妙招 ;而私有妙招 组织组织结构一般不时需一阵一阵关心,是有4个黑盒实现;愿因妙招 信息价值较低,所有 Service 和 DAO 的 getter/setter 妙招 插进类体最 后。

反例: String key = "Id#taobao_"+tradeId;

cache.put(key, value);

反例:直接使用 toArray 无参妙招 缺陷报告 图片,此妙招 返回值只有是 Object[]类,若强转其它 类型数组将再次出先 ClassCastException 错误。

class Foo {

private Helper helper = null; public Helper getHelper() {

if (helper == null) synchronized(this) { if (helper == null)

helper = new Helper();

}

return helper; }

// other functions and members...

}

反例:getObject()与 get0bject()的问题报告 图片。有4个是字母的 O,有4个是数字的 0,加@Override 可不利于够准确判断算是覆盖成功。另外,愿因在抽象类中对妙招 签名进行修改,人太好 现类会马上编 译报错。

正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion

反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

说明:以上代码的执行结果肯定会出乎大伙儿的意料,越来越 试一下把“1”打上去“2”,会是同样的结果吗?

正例:

反例:

public Integer getData() { if (true) {

return data + 60 ; } else {

return data - 60 ; }

}

说明:使用 toArray 带参妙招 ,入参分配的数组空间缺陷大时,toArray 妙招 组织组织结构将重新分配 内存空间,并返回新数组地址;愿因数组元素大于实际所需,下标为[ list.size() ]的数组 元素将被置为 null,其它数组元素保持原值,愿意最好将妙招 入参数组大小定义与集合元素 个数一致。

正例:

正例: localValue / getHttpMessage() / inputUserId

反例:

String str = "start";

for (int I = 0; I < 60 ; i++) {

str = str + "hello"; }

说明:反编译出的字节码文件显示每次循环时会 new 出有4个 StringBuilder 对象,愿意进行 append 操作,最后通过 toString 妙招 返回 String 对象,造成内存资源浪费。

第一、不利于准确反应设计思想和代码逻辑;

第二、不利于描述业务含 义,使别的应用程序员不利于迅速了解到代码眼前 的信息。详细越来越 注释的大段代码对于阅读者形同天书,注释是给当事人看的,即使隔很长时间,不利于清晰理解当时的思路;注释也是给继任者看 的,使其不利于快速接替当事人的工作。

反例:“TCP 连接超时”解释成“传输控制协议连接超时”,理解反而费脑筋。

说明:代码与注释更新不同步,就像路网与导航软件更新不同步一样,愿因导航软件严重滞后, 就一蹶不振 了导航的意义。

正例:public Enum { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);}

说明:代码被注释掉有两种愿因性:1)后续会恢复此段代码逻辑。2)永久不必。前者愿因没 有备注信息,难以知晓注释动机。后者建议直接删掉(代码仓库保存了历史代码)。

说明:注意,子应用程序抛出异常堆栈,只有在主应用程序 try-catch 到。

说明:

String str = "a,b,c,,";

String[] ary = str.split(","); //预期大于 3,结果是 3 System.out.println(ary.length);

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

说明:资源驱动类、工具类、单例工厂类都时需注意。

说明:keySet 人太好 是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet 但是遍历了一次就把 key 和 value 都插进了 entry 中,效 率更高。愿因是 JDK8,使用 Map.foreach 妙招 。

反例: AbstractClass“缩写”命名成 AbsClass; condition“缩写”命名成 condi,此类 随意缩写严重降低了代码的可阅读性。

阿里巴巴 Java 开发手册

1) 不时需重新赋值的变量,包括类属性、局部变量。 2) 对象参数前加final,表示不允许修改引用的指向。 3) 类妙招 选折 不允许被重写。

说明:注意愿因是 Boolean 包装类对象,优先调用 getXxx()的妙招 。

反例:下例中越来越 处理相等的情況,实际使用中愿因会再次出先异常:

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

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

if (condition) { ...

return obj; }

// 接着写 else 的业务逻辑代码;

说明:愿因非得使用if()...else if()...else...妙招 表达逻辑,【强制】请勿超过3层,

超过请使用情況设计模式。

正例:逻辑上超过 3 层的 if-else 代码可不利于够使用卫励志的话 ,愿因情況模式来实现。

说明:但是 if 励志的话 内的逻辑相当多样化,阅读者时需分析条件表达式的最终结果,不利于明确什么 样的条件执行什么样的励志的话 ,越来越 ,愿因阅读者分析逻辑表达式错误呢?

正例:

//伪代码如下

boolean existed = (file.open(fileName, "w") != null) && (...) || (...); if (existed) {

... }

反例:

if ((file.open(fileName, "w") != null) && (...) || (...)) { ...

}

说明:Random 实例包括 java.util.Random 的实例愿因 Math.random()实例。

正例:在 JDK7 完后 ,可不利于够直接使用 API ThreadLocalRandom,在 JDK7 完后 ,可不利于够做到每个 应用程序有4个实例。

正例:枚举名字:DealStatusEnum,成员名称:SUCCESS / UNKOWN_REASON。

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

####9. 【推荐】集合初始化时,尽量指定集合初始值大小。(其他是好习惯,尽量初始化的完后 打上去初始值,愿因集合在扩容的完后 还是挺消耗性能的,ArrayList初始值10)

说明:ArrayList尽量使用ArrayList(int initialCapacity) 初始化。

说明:使用应用程序池的好处是减少在创建和销毁应用程序上所花的时间以及系统资源的开销,处理资 源缺陷的问题报告 图片。愿因不使用应用程序池,有愿因造成系统创建几滴 之类于应用程序而愿因消耗完内存愿因 “过度切换”的问题报告 图片。

第两种情況:list.add("c"); 运行时异常。

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

说明:任何类、妙招 、参数、变量,严控访问范围。过宽泛的访问范围,不不利于模块解耦。(好习惯)

思考:愿因是有4个 private 的妙招 ,想删除就删除,但是有4个 public 的 Service妙招 ,愿因一 个 public 的成员变量,删除一下,不得手心冒点汗吗?变量像当事人的小孩,尽量在当事人的视 线内,变量作用域不必 ,愿因无限制的到处跑,越来越 让他担心的。

正例: 应用工具类包名为com.alibaba.open.util、类名为MessageUtils(此规则参考 spring 的框架形态)

1)【强制】对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,组织组织结构的实现类用 Impl 的后缀与接口区别。 正例:CacheServiceImpl 实现 CacheService 接口。

2)【推荐】 愿因是形容能力的接口名称,取对应的形容词做接口名(通常是–able 的形式)。 正例:AbstractTranslator 实现 Translatable。

说明:应用程序一时需对表 A、B、C 依次详细加锁后才可不利于够进行更新操作,越来越 应用程序二的加锁顺序 也时需是 A、B、C,愿意愿因再次出先死锁。

反例:POJO类的gmtCreate默认值为new Date();愿意其他属性在数据提取时并越来越 置入具 体值,在更新其它字段时又附带更新了此字段,愿因创建时间被修改成当前时间。

正例:values()返回的是 V 值集合,是有4个 list 集合对象;keySet()返回的是 K 值集合,是 有4个 Set 集合对象;entrySet()返回的是 K-V 值组合集合。

说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三目运算符等。

说明:java.net.URLDecoder 中的妙招 decode(String encodeStr) 其他妙招 愿因过时,应 该使用双参数 decode(String source, String encode)。接口提供方既然明确是过时接口, 越来越 有义务一块儿提供新的接口;作为调用方来说,有义务去考证过时妙招 的新实现是什么。

说明:注意 serialVersionUID 不一致会抛出序列化运行时异常。

正例:

public class TimerTaskThread extends Thread { public TimerTaskThread() {

super.setName("TimerTaskThread"); ... }

正例: MAX_STOCK_COUNT

反例: MAX_COUNT