阿里巴巴代码规范

一、 命名风格

1.类名

UpperCamleCase

2.方法名、参数名、成员变量、局部变量

lowerCamleCase

3.常量名

全部大写,单词间下划线隔开

MAX_STOCK_COUNT

4.抽象类命名

AbstractBase开头

5.异常类命名

xxxException

6.测试类命名

xxxTest

7.数组

定义整形数组 int[] arrayDemo

8.POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。

9.包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xJ4nAQla-1654337319922)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505182314181.png)]

10.避免不规范缩写

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

11.在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度

startTime

workQueue

nameList

12.如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式。

public class OrderFactory

public class LoginProxy

public class ResourceObserver

13.接口类中的方法和属性不要加任何修饰符号**(public 也不要加)**,保持代码的简洁性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,确定与接口方法相关,并且是整个应用的基础常量。

方法:void commit();

常量:String COMPANY="alibaba";

14.对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用Impl 的后缀与接口区别。

CacheServiceImpl实现CacheService

15.Service/DAO 层方法命名规约

1) 获取单个对象的方法用 get 做前缀。

2) 获取多个对象的方法用 list 做前缀,复数结尾,如:listObjects。

3) 获取统计值的方法用 count 做前缀。

4) 插入的方法用 save/insert 做前缀。

5) 删除的方法用 remove/delete 做前缀。

6) 修改的方法用 update 做前缀。

二、常量定义

1.不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。

缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 SystemConfigConsts 下。

三、代码格式

1.if/for/while/switch/do 等保留字与括号之间都必须加空格。

2.任何二目、三目运算符的左右两边都需要加一个空格。

a = b a && b

3.采用 4 个空格缩进,禁止使用 Tab 字符。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eldt5HmF-1654337319923)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505183602488.png)]

4.注释的双斜线与注释内容之间有且仅有一个空格。

// 注释

5.在进行类型强制转换时,右括号与强制转换值之间不需要任何空格隔开。

double first = 3.2d;
int second = (int)first + 2;

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

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

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

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

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

5)在括号前不要换行

StringBuilder sb = new StringBuilder;
sb.append("yang").append("yao").append("chen")....append("chen");

6.方法参数在定义和传入时,多个参数逗号后面必须加空格。

method(args1, args2, args3);

7.不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。

四、OOP规约

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

2.所有的覆写方法,必须加@Override 注解。

3.Objectequals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals

正确:

"test".equals(object);

错误:

object.equals("test");//不能反着来

4.所有整型包装类对象之间值的比较,全部使用 equals 方法比较。

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

5.浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals来判断。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P6q4byAW-1654337319923)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505185004686.png)]

如上所示 BigDecimal 的等值比较应使用 compareTo()方法,而不是 equals()方法。equals()方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 compareTo()则会忽略精度。

6.定义数据对象 DO 类时,属性类型要与数据库字段类型相匹配。

正例:数据库字段的 bigint 必须与类属性的 Long 类型相对应。

反例:某个案例的数据库表 id 字段定义类型 bigint unsigned,实际类对象属性为 Integer,随着 id 越来越大,超过 Integer 的表示范围而溢出成为负数。

7.禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象。

也就是说只能用上述的new方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LbuwDmjJ-1654337319923)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505185225533.png)]

8.所有的 POJO 类属性必须使用包装数据类型。

9.所有的局部变量使用基本数据类型。

10.定义 DO/DTO/VOPOJO 类时,不要设定任何属性默认值。

POJO 类的 createTime 默认值为 new Date(),但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。

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

12.类内方法定义的顺序依次是:公有方法或保护方法 > 私有方法 > getter / setter方法。

13.setter 方法中,参数名称与类成员变量名称一致,this.成员名 = 参数名。在

getter/setter 方法中,不要增加业务逻辑,增加排查问题的难度。

14.循环体内,字符串的连接方式,使用 StringBuilderappend 方法进行扩展。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04z2z5Ko-1654337319923)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505185536869.png)]

五、日期时间

1.日期格式化时,传入 pattern 中表示年份统一使用小写的 y

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PsZVQTIA-1654337319924)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505185654182.png)]

2.获取当前毫秒数:System.currentTimeMillis(); 而不是 new Date().getTime()

3.不允许在程序任何地方中使用:

1)java.sql.Date

2)java.sql.Time

3)java.sql.Timestamp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5n23wYZH-1654337319924)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505185845796.png)]

4.不要在程序中写死一年为 365 天,避免在公历闰年时出现日期转换错误或程序逻辑错误。

//获取今年的天数
int daysOfThisYear = LocalDate.now().lengthOfYear();
//获取指定某一年的天数
LocalDate.of()

六、集合处理

1.判断所有集合内部的元素是否为空,使用 isEmpty() 方法,而不是 size()==0 的方式。

前者时间复杂度在某些集合中为O(1),且可读性更好。

2.使用 Map 的方法 keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出 UnsupportedOperationException 异常。

3.使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一致、长度为 0 的空数组。

4.不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。

List<String>list = new ArrayList<>();
list.add("1");
list.add("2");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){String item = irerator.next();if(xxx){iterator.remove();}
}

5.Comparator 实现类要满足如下三个条件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sREfVjFl-1654337319924)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505192719782.png)]

七、并发处理

暂时没看。

八、控制语句

1,在一个 switch 块内,每个 case 要么通过 continue/break/return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个 default语句并且放在最后,即使它什么代码也没有。

2.当 switch 括号内的变量类型为 String 并且此变量为外部参数时,必须先进行 null判断。

3.在 if/else/for/while/do 语句中必须使用大括号。

4.在高并发场景中,避免使用”等于”判断作为中断或退出的条件。

6.表达异常的分支时,少用 if-else 方式,这种方式可以改写成:

7.除常用方法(如 getXxx/isXxx)等外,不要在条件判断中执行其它复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxmBvZyJ-1654337319924)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505193605625.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vnELVBkM-1654337319924)(…/…/…/Library/Application%20Support/typora-user-images/image-20220505193612946.png)]

九、注释规约

1.类、类属性、类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用 // xxx 方式。

2.所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。

3.所有的类都必须添加创建者和创建日期。

 /**
\* @姚同学
\* @date 2022/05/05
*/

4.方法内部单行注释,在被注释语句上方另起一行,使用 // 注释。方法内部多行注释使用 /* */ 注释,注意与代码对齐。

5.代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。

6.谨慎注释掉代码。在上方详细说明,而不是简单地注释掉。如果无用,则删除。

  • 说明:代码被注释掉有两种可能性:

    1)后续会恢复此段代码逻辑。

    2)永久不用。前者如果没有备注信息,难以知晓注释动机。后者建议直接删掉即可,假如需要查阅历史代码,登录代码仓库即可。

7.对于注释的要求:第一、能够准确反映设计思想和代码逻辑;第二、能够描述业务含义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看的,使其能够快速接替自己的工作。

十、前后端规约

1.前后端交互的 API,需要明确协议、域名、路径、请求方法、请求内容、状态码、响应体。

  • 说明: 1) 协议:生产环境必须使用 HTTPS。 2) 路径:每一个 API 需对应一个路径,表示 API 具体的请求地址: a) 代表一种资源,只能为名词,推荐使用复数,不能为动词,请求方法已经表达动作意义。 b) URL 路径不能使用大写,单词如果需要分隔,统一使用下划线。 c) 路径禁止携带表示请求内容类型的后缀,比如".json",“.xml”,通过 accept 头表达即可。 3) 请求方法:对具体操作的定义,常见的请求方法如下: a) GET:从服务器取出资源。 b) POST:在服务器新建一个资源。 c) PUT:在服务器更新资源。 d) DELETE:从服务器删除资源。 4) 请求内容:URL 带的参数必须无敏感信息或符合安全要求;body 里带参数时必须设置 Content-Type。 5) 响应体:响应体 body 可放置多种数据类型,由 Content-Type 头来确定。

2.前后端数据列表相关的接口返回,如果为空,则返回空数组[]或空集合 {}

(减少前端的null判断)

3.服务端发生错误时,返回给前端的响应信息必须包含 HTTP 状态码,errorCodeerrorMessage、用户提示信息四个部分。

  • 说明:四个部分的涉众对象分别是浏览器、前端开发、错误排查人员、用户。其中输出给用户的提示信息要求:简短清晰、提示友好,引导用户进行下一步操作或解释错误原因,提示信息可以包括错误原因、上下文环境、推荐操作等。 errorCode:参考附表 3errorMessage:简要描述后端出错原因,便于错误排查人员快速定位问题,注意不要包含敏感数据信息。

  • 正例:常见的 HTTP 状态码如下 1) 200 OK: 表明该请求被成功地完成,所请求的资源发送到客户端。 2) 401 Unauthorized: 请求要求身份验证,常见对于需要登录而用户未登录的情况。 3) 403 Forbidden:服务器拒绝请求,常见于机密信息或复制其它登录用户链接访问服务器的情况。 4) 404 Not Found: 服务器无法取得所请求的网页,请求资源不存在。 5) 500 Internal Server Error: 服务器内部错误。

4.在前后端交互的 JSON 格式数据中,所有的 key 必须为小写字母开始的 lowerCamelCase 风格,符合英文表达习惯,且表意完整。

5.对于需要使用超大整数的场景,服务端一律使用 String 字符串类型返回,禁止使用 Long 类型。

6.在翻页场景中,用户输入参数的小于 1,则前端返回第一页参数给后端;后端发现用户输入的参数大于总页数,直接返回最后一页。

7.前后端的时间格式统一为"yyyy-MM-dd HH:mm:ss",统一为 GMT。

十一、安全规约

1.在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放的机制,如数量限制、疲劳度控制、验证码校验,避免被滥刷而导致资损。

说明:如注册时发送验证码到手机,如果没有限制次数和频率,那么可以利用此功能骚扰到其它用户,并造成短信平台资源浪费。

2.发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过滤等风控策略。

阿里巴巴代码规范 学习总结相关推荐

  1. 阿里巴巴代码规范学习+redis stream

    阿里巴巴代码规范学习 1.volatile volatile是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直 ...

  2. IDEA 阿里巴巴代码规范检查插件使用

    1.问题概要 大家都想写出规范的代码,可规范的标准是什么勒,估计每个人心中的标准都不是完全一致的 在分工合作越来越精细化的时代,我们需要一个最大程度接近公认的规范,这里我们以阿里巴巴的代码规范作为参考 ...

  3. 阿里巴巴编码规范学习及应用

    点击 Mr.绵羊的知识星球 解锁更多优质文章. 目录 一.介绍 二.学习及应用 三.总结 一.介绍 无规矩不成方圆,无规范不能协作.近万名阿里Java技术精英的经验总结,并经历了多次大规模一线实战检验 ...

  4. Idea之阿里巴巴代码规范

    文章目录 Idea之阿里巴巴规范 1. 代码格式化 1.1 google的格式化插件 1.1.1 google-java-format安装 1.1.2 Checkstyle-IDEA安装 1.1.3 ...

  5. C++代码规范 学习笔记

    C++代码规范 参考https://blog.csdn.net/zang141588761/article/details/50608736 一.文件排版方面 1. 包含头文件 • 先系统头文件,后用 ...

  6. 阿里巴巴代码规范扫描

    1.简介 接手前同事的代码一段时间了,看得我真心难受.没有注释,各种奇怪的命名,比如你能看到一个类里面出现getSetCache和getCacheSet两个方法,传参也不同,(我也不知道这个人是不是方 ...

  7. 阿里巴巴代码规范-note

    阿里巴巴在之前的云栖大会上正式发出了 阿里巴巴Java开发手册. 并发布相关的Idea插件. 具体的信息可以到Github主页 p3c查看. 最近将手册重新学习了一遍, 发现在之前的工程项目里面, 有 ...

  8. 2018.3.2版本idea 安装阿里巴巴代码规范

    阿里规范插件GitHub地址:https://github.com/alibaba/p3c IDEA安装该插件步骤: 1.打开IDEA,File-> Setteings->Plugins- ...

  9. 阿里巴巴代码规范【强制】

    一.编程规约 (一)命名风格 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例:_name / $name / name_ / name$ 严禁使用拼音与英文混合的方式, ...

  10. Eclipse安装阿里巴巴代码规范插件p3c

    第一步:进入Help->Install New Software 第二步:输入 https://p3c.alibaba.com/plugin/eclipse/update  第三步:安装完成后重 ...

最新文章

  1. 中关村windows11 32位专业版镜像v2021.07
  2. ArcGIS JS API 4 —— GET https://static.arcgis.com/fonts/simsun-regular/37888-38143.pbf 404
  3. 在Windows下正确安装Scipy与Numpy
  4. 项目管理计划包含哪些内容
  5. linux中mvn命令的下载与安装
  6. Android之录制歌曲
  7. 三级联动下拉框(省市县)存储数据库,包含信息回填
  8. 泰勒(Taylor)展开式
  9. mpvue + vuex搭建小程序详细教程
  10. 苹果:用Impactor安装软件时出现Line:182错误
  11. 转:MIME(Multipurpose Internet Mail Extensions)类型
  12. 离线语音识别芯片对比
  13. 如何快速定位自己热爱的工作
  14. 学计算机的大学计划书,计算机系大学计划书
  15. 01- NumPy 数据库 (数据库)
  16. docker搭建searx_Searx
  17. 高级UI设计必备三个意识
  18. 江苏省高二计算机考试知识点总结,江苏省计算机一考试知识点整理.doc
  19. PopupWindow实现屏幕底部弹出
  20. 2005年,全国城市(实际建成区)面积排名

热门文章

  1. 《WinHex》误使用Ghost恢复系统恢复数据图文教程
  2. LVDT位移传感器的构成原理及特点
  3. 数据中心风侧直接自然冷却节能潜力分析
  4. iOS 整理iOS9适配中出现的坑
  5. 反病毒工具 PCHunter 1.5.6
  6. 常用射频接头之2.92mm
  7. iOS开发之YYKit丰富的组件,如:YYText
  8. win7 oracle如何卸载干净,win7如何完全卸载oracle
  9. jdk8安装和环境变量配置
  10. Gerber文件的输出