前言

参考自: 微信公众号"java3y"中的文章 - 《阿里巴巴 Java开发手册》读后感

都是日常能用的一些规范, 还是很有用处的!

一、Java相关

1.POJO是DO/DTO/BO/VO的统称,禁止命名为xxxPOJO

2.获取多个对象的方法中list作为前缀

3.获取统计值的方法用count作为前缀

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

如果你的变量名带is的话,比如isActive,框架解析的时候可能就当成active了

5.如果是形容能力的接口名称,取对应的形容词为接口名(通常是-able的形式)

6.不允许任何魔法值(未经预先定义的常量)直接出现在代码中

7.Object的euqals方法容易抛出空指针异常,应使用常量或者有值的对象来调用equals。推荐使用java.util.Objects#equals工具类

8.所有POJO类的属性全部使用包装数据类型,RPC的返回值和参数必须使用包装数据类型,所有的局部变量都使用基本数据类型。定义VO/DTO/DO等POJO类时,不要设定任何属性的默认值

如果你的类属性使用int这样的基本数据类型,默认值是0。一般情况下该变量没有赋值,一般想表达的是不存在(null),而不是0。

9.构造方法禁止加入任何的业务逻辑,如果初始化逻辑可以放在init方法中。set/get方法也不要增加业务逻辑

如果set/get方法放入业务逻辑,有时候排查问题就变得很麻烦了

10.工具类Arrays.asList()把数组转成List时,不能使用其修改集合的相关方法。比如说add、clear、remove

11.在JDK7以及以上版本中,Comparator要满足三个条件,不然调用Arrays.sort()或者Collections.sort()会报异常。

11.1x,y 的比较结果和 y,x 的比较结果相反

11.2传递性:x>y并且y>z,那么x一定大于z

11.3对称性:x=y,则 x,z 比较结果和y,z比较结果相同

12.使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历

keySet遍历了两次,一次是转成Iterator对象,一次是从hashMap中取出key所对应的value,如果JDK8可以使用Map.foreach方法

13.线程资源必须由线程池提供,不允许在应用中自行显示创建线程。线程池不允许用Executors创建,通过ThreadPoolExecutor的方式创建,这样的处理方式能够让编写代码的工程师更加明确线程池的运行规则,规避资源耗尽的风险。

14.SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类

如果是JDK8应用,可以使用Instant(针对时间统计等场景)代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat

15.避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed导致性能下降

在JDK7之后,可以直接使用API ThreadLocalRandom,而在JDK7 之前,需要编码保证每个线程持有一个实例。

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

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

18.对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码的上方,使用三个斜杠///来说明注释代码的理由

19.保证单元测试的独立性。为了保证单元测试稳定可靠且便于维护,单元测试之间不能互相调用,也不能依赖执行的先后顺序。

20.高并发服务器建议调小TCP协议的time_await超时时间,调大最大事件句柄数(fd),

1.1值得说明的点

一、不允许任何魔法值(未经预先定义的常量)直接出现在代码中

例子:

ps:我猜是把先常量定义出来,后续引用/修改的时候就很方便了。

二、Object的euqals方法容易抛出空指针异常,应使用常量或者有值的对象来调用equals。推荐使用java.util.Objects#equals工具类

java.util.Object#equals的源码(已经判断null的情况了)

三、工具类Arrays.asList()把数组转成List时,不能使用其修改集合的相关方法。

因为返回的ArrayList是一个内部类,并没有实现集合的修改方法。后台的数据仍是数组,这里体现的是适配器模式。

四、在JDK7以及以上版本中,Comparator要满足自反性,传递性,对称性,不然调用Arrays.sort()或者Collections.sort()会报异常。

1) x,y 的比较结果和 y,x 的比较结果相反。

2) 传递性:x>y,y>z,则 x>z。

3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。

反例:下例中没有处理相等的情况,实际使用中可能会出现异常:

五、使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历

首先我们来看一下使用keySet是如何遍历HashMap的:

再来看一下entrySet,可以直接拿到key和value,不用再使用get方法来得到value,所以比keySet更加推荐使用!

如果是JDK8的话,推荐直接使用Map.forEach()就好了,我们也来看看用法:

其实在源码里边我们可以发现,forEach实际上就是封装了entrySet,提供forEach给我们可以更加方便地遍历Map集合

六、SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。

有以下的例子可以正确使用SimpleDateFormat:

如果是JDK8应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat。

二、数据库相关

1.表达是否概念的字段,必须使用isxxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否)

2.小数类型用decimal,禁止使用float和double。

3.varchar是可变字符串,不预选分配存储空间的话,长度不要超过5000个字符。如果超过则用text,独立一张表,用主键对应,避免影响到其他字段的索引效率。

4.表必备的三个字段:id(类型是unsigned bigint),gmt_create(创建时间),gme_modified(修改时间)

5.字段允许适当冗余,以提高查询性能,但必须考虑数据一致性。冗余的字段必须不是频繁修改的字段,不是varhar超长字段(更不能是text字段)。

6.单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表(如果预计三年都达不到这个数据量,不要在创建表的时候就分库分表!)

7.超过三个表禁止使用join,需要join的字段,数据类型必须保持一致,当多表关联查询时,保证被关联的字段需要有索引!

8.在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,页面搜索严禁左模糊或者全模糊,如果需要则通过搜索引擎来解决。

充分利用好最左前缀匹配特性!

9.利用延迟关联或者子查询优化超多也分场景。

10.如果有全球化需要,均以utf-8编码。如果需要存储表情,选择utf8mb4进行存储。

阿里巴巴java规范_《阿里巴巴 Java开发手册》常用规范相关推荐

  1. 【Java】Java 开发手册以及规范

    Java 开发手册以及规范 一.编程规约 (一) 命名规约 1. [强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: name _name _name / __ ...

  2. 为什么阿里巴巴Java开发手册编码规范里推荐单个方法的总行数不超过80行

    该篇文章参考了: 1. 阿里巴巴<java开发手册>v1.5.0 华山版 2. <码出高效:Java开发手册> 单个方法的总行数不超过80行 在阿里巴巴<java开发手册 ...

  3. Java开发手册及规范

    前言 为了利于项目维护以及规范开发,促进成员之间Code Review的效率,故提出以下开发规范 根据约束力强弱, 规约依次分为强制.推荐.参考三大类: [强制]必须遵守,违反本约定或将会引起严重的后 ...

  4. java单元测试 规范_单元测试-java

    单元测试-java Maven项目 ​ 学java必学!!! 如果你不愿意变强,请百度搜索idea或Eclipse怎么使用Junit. ​ 单元测试,也需要遵循一定的编程规范,不能随便的写一个地方,也 ...

  5. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...

    最近逛知乎,发现有很多想自学 Java 或者 Java 初学者提问,不知道如何学习 Java?我接触 Java 快 8 年的时间了,一直从事 Java 开发工作,自己一直升级打怪,对于如何更好的学习 ...

  6. android命名规范阿里,阿里android开发手册 PDF 下载

    主要内容: 二.Android 资源文件命名与使用 1. [推荐]资源文件需带模块前缀. 2. [推荐]layout 文件的命名方式. Activity 的 layout 以 module_activ ...

  7. java掌握_掌握Java 11的Constantdynamic

    java掌握 为了使JVM对动态语言更具吸引力,该平台的第七版已将invokedynamic引入了其指令集. Java开发人员通常不会注意到此功能,因为该功能已隐藏在Java字节码中. 简而言之,通过 ...

  8. 阿里 前端 规范_阿里前端开发规范

    前端代码规范 Front Standard Guide 前端 JS 项目开发规范 规范的目的是为了编写高质量的代码,让你的团队成员每天得心情都是愉悦的,大家在一起是快乐的. 引自<阿里规约> ...

  9. java魔塔_基于java的魔塔游戏的设计与实现论文.docx

    毕业设计(论文)题目: 基于java的魔塔游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.了解和运用Java面向对象的特性: 2.熟练掌握模块化设计的思想,锻炼使用java语言的能力: ...

  10. java安装_使用Java 9模块化来发布零依赖本机应用程序

    java安装 为什么我不能仅构建一个.EXE? 首次引入Java时,主流编程语言大多要么编译成独立的可执行文件(例如C / C ++,COBOL),要么在解释器中运行(例如Perl,Tcl). 对于许 ...

最新文章

  1. Drug Discov. Today | 简要综述GNNs用于分子性质预测
  2. 深入解析Node.js setTimeout方法的执行过程
  3. matplotlib 简单试用
  4. oracle建立表语句 主键,oracle 创建表sql语句,主键,自增长
  5. mos管结电容等效模型_MOS管等效模型
  6. Atitit 破解qq空间(2)-------探测权限
  7. 西北大学计算机课表,西北大学课表_2
  8. BI项目中ETL设计与思考
  9. 1299: Problem 1
  10. 基于GIS的中国历代名人人生轨迹研究
  11. Mac 上删除键(delete)的妙用
  12. php7的新特性有哪些,php7新特性有哪些?
  13. 华为无线设备Mesh配置命令
  14. 暑假集训日记(四)(长题解)
  15. 数学建模常用模型07 :模糊综合评价法
  16. Melanopic EDI(简称m-EDI) 计算软件
  17. 约束多目标优化 约束多目标进化/演化算法入门论文文献推荐 大部分论文代码已开源
  18. 文件传输协议(FTP)
  19. c语言管道文件隐藏dos,实用dos下显示隐藏文件的命令
  20. TMS320C6678开发板( DSP+Zynq )RTOS综合功能案例,嵌入式必看!

热门文章

  1. 汉若塔c语言源码,汉诺塔C语言.doc
  2. SVN 删除文件及其恢复大全
  3. 基于Canvas和HTML+CSS3构建JavaScript弹幕库
  4. mac电脑利用file和iconv命令修改文件编码
  5. 多变量遗传算法python代码_遗传算法之Python实现代码
  6. 思科软件服务器怎么作用,Cisco设备如何应用应用TFTP服务器
  7. CSS 图片去色处理
  8. 卡巴斯基授权文件获取网站
  9. 光敏传感器介绍及其软件应用
  10. ssl教程易语言代码