JAVA开发手册华山版 - 学习笔记

最近开始实习,前一两周主要在学习(摸鱼),然后看了一下阿里巴巴的Java开发手册(华山版),发现自己在开发过程还有很多不够规范的地方,在这里记录一下

关于Java开发手册

《Java开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,公开到业界后,众多社区开发者踊跃参与,共同打磨完善,系统化地整理成册。现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量。比如:数据库的表结构和索引设计缺陷可能带来软件上的架构缺陷或性能风险;工程结构混乱导致后续维护艰难;没有鉴权的漏洞代码易被黑客攻击等等。所以本手册以Java开发者为中心视角,划分为编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约七个维度,再根据内容特征,细分成若干二级子目录。另外,依据约束力强弱及故障敏感性,规约依次分为强制、推荐、参考三大类。在延伸信息中,“说明”对规约做了适当扩展和解释;“正例”提倡什么样的编码和实现方式;“反例”说明需要提防的雷区,以及真实的错误案例。

JAVA开发手册(华山版)下载

这是我的百度网盘位置,大家可以在这里下载,也可以自己去找最新版

链接
https://pan.baidu.com/s/14ih53jnW03m-xa35HmKINA
提取码:fapc

一、编程规约

1. 编程风格

  1. 强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME 
反例:MAX_COUNT / EXPIRED_TIME
  1. 强制】抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
  2. 强制】POJO类中布尔类型变量都不要加is前缀,否则部分框架解析会引起序列化错误。说明:在本文MySQL规约中的建表约定第一条,表达是与否的值采用is_xxx的命名方式,所以,需要在设置从is_xxx到xxx的映射关系。
反例:定义为基本数据类型Boolean isDeleted的属性,
它的方法也是isDeleted(),RPC框架在反向解析的时候,
“误以为”对应的属性名称是deleted,
导致属性获取不到,进而抛出异常。
  1. 【推荐】在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。
正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT
反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD
  1. 【参考】各层命名规约:
  • Service/DAO层方法命名规约
    1) 获取单个对象的方法用get做前缀。
    2) 获取多个对象的方法用list做前缀,复数形式结尾如:listObjects。
    3) 获取统计值的方法用count做前缀。
    4) 插入的方法用save/insert做前缀。
    5) 删除的方法用remove/delete做前缀。
    6) 修改的方法用update做前缀。
  • 领域模型命名规约
    1) 数据对象:xxxDO,xxx即为数据表名。
    2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
    3) 展示对象:xxxVO,xxx一般为网页名称。
    4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

2. 常量定义

  1. 强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
反例:String key = "Id#taobao_" + tradeId; cache.put(key, value);
// 缓存get时,由于在代码复制时,漏掉下划线,导致缓存击穿而出现问题
  1. 强制】在long或者Long赋值时,数值后使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。 说明:Long a = 2l; 写的是数字的21,还是Long型的2。

3. 代码格式

  1. 强制】如果是大括号内为空,则简洁地写成{}即可,大括号中间无需换行和空格;如果是非空代码块则:
    1) 左大括号前不换行。
    2) 左大括号后换行。
    3) 右大括号前换行。
    4) 右大括号后还有else等代码则不换行;表示终止的右大括号后必须换行。

  2. 强制】采用4个空格缩进,禁止使用tab字符。
    说明:如果使用tab缩进,必须设置1个tab为4个空格。IDEA设置tab为4个空格时,请勿勾选Use tab character;而在eclipse中,必须勾选insert spaces for tabs。
    正例:

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");
// 在右大括号后直接结束,则必须换行
}
}
  1. 强制】单行字符数限制不超过120个,超出需要换行,换行时遵循如下原则:
    1)第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进,参考示例。
    2)运算符与下文一起换行。
    3)方法调用的点符号与下文一起换行。
    4)方法调用中的多个参数需要换行时,在逗号后进行。
    5)在括号前不要换行,见反例。

正例:

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

4. OOP规约

  1. 强制】所有的覆写方法,必须加@Override注解。 说明:getObject()与get0bject()的问题。一个是字母的O,一个是数字的0,加@Override可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。
  2. 强制】相同参数类型,相同业务含义,才可以使用Java的可变参数,避免使用Object。 说明:可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程) 正例:public List listUsers(String type, Long… ids) {…}
  3. 强制】Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
正例:"test".equals(object); 
反例:object.equals("test"); 
说明:推荐使用java.util.Objects#equals(JDK7引入的工具类)。
  1. 强制】所有整型包装类对象之间值的比较,全部使用equals方法比较。 说明:对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在 IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
  2. 强制】浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。 说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数,具体原理参考《码出高效》。

反例:

float a = 1.0f - 0.9f; float b = 0.9f - 0.8f; 
if (a == b) {
    
// 预期进入此代码快,执行其它业务逻辑 
// 但事实上a==b的结果为false 
} 
Float x = Float.valueOf(a); 
Float y = Float.valueOf(b); 
if (x.equals(y)) {
    
// 预期进入此代码快,执行其它业务逻辑 
// 但事实上equals的结果为false 
} 

正例:
(1) 指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。

float a = 1.0f - 0.9f; 
float b = 0.9f - 0.8f; 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值