1.3.0 终极版 2017.09.25 单元测试规约,IDE代码规约插件
1.3.1 纪念版 2017.11.30 修正部分描述
1.4.0 详尽版 2018.05.20 增加设计规约大类,共16条
1.5.0 华山版 2019.06.19 详细更新见下面
本笔记主要基于华山版(1.5.0)的总结。华山版具体更新如下:
鉴于本手册是社区开发者集体智慧的结晶,本版本移除阿里巴巴Java开发手册的限定词阿里巴巴
新增21条新规约。比如,switch的NPE问题、浮点数的比较、无泛型限制、锁的使用方式、判断表达式、日期格式等
修改描述112处。比如,IFNULL的判断、集合的toArray、日志处理等
完善若干处示例。比如,命名示例、卫语句示例、enum示例、finally的return示例等。
PDF下载地址: https://pan.baidu.com/s/1K-GZ_CzRC0igIxMgLGVtZQ 密码:关注行无际的微信公众号:it_wild,回复java开发手册
专有名词解释POJO(Plain Ordinary Java Object): 在本手册中,POJO专指只有setter、getter、toString的简单类,包括DO、DTO、BO、VO等。
GAV(GroupId、ArtifactctId、Version): Maven坐标,是用来唯一标识jar包。
OOP(Object Oriented Programming): 本手册泛指类、对象的编程处理方式。
ORM(Object Relation Mapping): 对象关系映射,对象领域模型与底层数据之间的转换,本文泛指ibatis, mybatis等框架。
NPE(java.lang.NullPointerException): 空指针异常。
SOA(Service-Oriented Architecture): 面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用,有利于提升组件可重用性,可维护性。
IDE(Integrated Development Environment): 用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具,本《手册》泛指 IntelliJ IDEA 和eclipse。
OOM(Out Of Memory): 源于java.lang.OutOfMemoryError,当JVM没有足够的内存来为对象分配空间并且垃圾回收器也无法回收空间时,系统出现的严重状况。
一方库:本工程内部子项目模块依赖的库(jar包)。
二方库:公司内部发布到中央仓库,可供公司内部其它应用依赖的库(jar包)。
三方库:公司之外的开源库(jar包)。
一、 编程规约 (一) 命名风格 正例:国际通用的名称,可视同英文;alibaba / youku / hangzhou 等
类名使用UpperCamelCase风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。如:UserDO / XmlService / TcpUdpDeal
方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式;localValue / getHttpMessage / inputUserId
常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。MAX_STOCK_COUNT / CACHE_EXPIRED_TIME
抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾
类型与中括号紧挨相连来表示数组,定义整形数组 int[] arrayDemo;
包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。包名com.alibaba.ai.util,类名为MessageUtils(此规则参考spring的框架结构)
为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。在JDK中,表达原子更新的类名为:AtomicReferenceFieldUpdater
在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。如:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT
如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式(将设计模式体现在名字中,有利于阅读者快速理解架构设计理念)。如: class OrderFactory / class LoginProxy / class ResourceObserver
接口类中的方法和属性不要加任何修饰符号(public也不要加),保持代码的简洁性,并加上有效的Javadoc注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。接口方法签名void commit();,接口基础常量String COMPANY = "alibaba";
对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。如CacheServiceImpl实现CacheService接口
如果是形容能力的接口名称,取对应的形容词为接口名(通常是–able的形容词)如 AbstractTranslator实现Translatable接口