本次学习 来源 阿里巴巴Java开发手册 ,文档更新时间2016.12.7 是阿里巴巴集团技术部 首次向Java业界公开,如果有需要开发手册源文档的,欢迎联系
编程规约
命名规约
1.【强制】所有编程相关命名均不能以下划线或者美元符号 开始,也不能以下划线或美元符号结束
反例: _name / __name / $Object / name_ / name$ /Object$
2.【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使存拼音命名方式也要避免使用。
反例:DaZhePromotion [打折] / getPingfenByName [评分] / int 变量 = 3
正例:ali/ alibaba /taobao/ cainiao/aliyun/youku/hangzhou
等国际通用的名称 ,可视为中文。
3.【强制】类名使用UpperCamelCase
风格,必须遵从驼峰形式,但以下情形例外(领域模型的相关命名)DO /DTO /VO /DAO
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:maroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
4.【强制】方法名,变量名,成员变量,局部变量都统一使用lowerCamelCase
风格,必须遵从驼峰形式
正例:localValue / getHttpMessage() / inputUserId
5.【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长
正例 MAX_STOCK_COUNT
反例:MAX_COUNT
6.【强制】抽象类命名使用Abstract 或者Base 开头;异常类命名使用Exception 结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
7.【强制】中括号 是数组类型的一部分,数组的定义如下:String[] args
反例:请勿使用String args[]
的方式来定义
8.【强制】POJO 类 中的任何布尔型的变量,都不要加 is, 否则部分框架解析会引起序列化错误
说明:POJO 类指的就是 那些JavaBean 类
9.【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词,包名统一使用单数形式,但是类名如果有复数含义。类名可以使用复数形式
正例:应用工具类包名 为com.alibaba.mpp.util
、类名为MessageUtils (此规则参考spring 的框架结构)
10.【强制】杜绝完全不规范的缩写,避免望文生义。
反例:某业务代码 AbstractClass 缩写为AbsClass condition 缩写命名为 condi ,此类随意缩写严重降低了代码的可阅读性
11.【推荐】如果使用到了设计模式,建议在类名中体现出具体的设计模式。
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计思想
正例:public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;
12.【推荐】接口类中的方法和属性不要加任何修饰符号(public 也不要加)保持代码的简洁性,并加上有效的javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。
正例:接口方法签名 void f();
接口基础常量表示 String COMPNY =“alibaba
反例:接口方法定义 public abstract void f();
说明:JDK8 中,接口允许有默认实现,那么这个default 方法,是对所有实现类都有价值的默认实现。
13.接口 和实现类的命名有两套规则:
1)【强制】对于Service 和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl 的后缀 与接口区别。
正例:CacheServiceImpl 实现 CacheService 接口
2)【推荐】如果是形容能力的接口名称,取对应的形容词做接口名(通常是 -able 的形式)
正例:AbstractTranslator 实现 Translatable
14【参考】枚举类 建议带上Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。
说明:枚举其实就是特殊的常量类,且构造方法被默认强制是私有。
正例:枚举名称 DealStatusEnmu;成员名称 SUCESS / UNKOWN_REASON
15.【参考】各层命名规约
A) Service /DAO 层方法命名规
- 1,获取单个对象的方法用get 做前缀
- 2,获取多个对象的方法 用list 做前缀
- 3,获取统计值的方法 用count 做前缀
- 4,插入的方法用 save 或 insert 做前缀
- 5,删除的方法用remove 或delete 做前缀
- 6,修改的方法用update 做前缀
B) 领域模型命名规约
- 1 , 数据对象:xxxDO, xxx 即为数据表名
- 2,数据传输对象:xxxDTO ,xxx为业务领域相关的名称
- 3,展示对象:xxxVO, xxx 一般为网页名称
- 4, POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO
常量定义
1.【强制】不允许出现任何魔法值(即未定义的常量)直接出现在代码中
反例:String key = "Id#taobao_"+tradeId;
cache.put( key, value );
2.【强制】long 或者Long 初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1 混淆,造成误解。
说明 :Long a = 2l; 要写成 Long a = 2L;
3.【推荐】不要使用一个常量类维护所有的常量,应该按照常量功能进行归类,分开维护,
如 缓存相关的常量放在类 :CacheConsts 下,系统配置相关的常量放在类 ConfigConsts下。
说明:大而全的常量类,非得 ctrl +f 才能定位到修改的常量,不利于理解,也不利于维护。
4.【推荐】如果变量值仅在一个范围内变化用Enum类。如果还带有名称之外的延伸属性,必须使用Enum类,下面正例中的数字就是延伸信息,表示星期几。
正例:public Enum{ MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7); }