Java开发规范之命名篇(上)

阿里巴巴早在2017年就推出了《Java开发手册》,旨在规范Java开发人员在开发过程中的编码,这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本。

为了让开发者更加方便、快速的将规范推动并实行起来,阿里巴巴基于手册内容,研发了一套自动化的IDE检测插件, 该插件在扫描代码后,将不符合手册规范的代码显示在界面中。我们可以在IDEA中选择 Preferences - Plugins - Browse repositories ,输入框中输入"alibaba",选择"Alibaba Java Coding Guidelines"进行安装,重启IDEA后即可使用。

Google也在2016年推出了《Java编程规范》,它是Google公司对Java编程风格规范的完整定义,主要内容包含编码格式是否美观的问题, 同时也讨论一些约定及编码标准。国内已经有人将其翻译为中文,具体请参考 Google《Java编程规范》中文版 ,另外如果需要PDF文档可以在 这里 去下载 。另外在Eclipse IDE和 IntelliJ IDE可以导入代码风格配置文件,可以方便使用该编码规范,请点击 传送门,具体方法是依次点击 Window -> Preferences -> Java -> Code Style -> Formatter -> Import,导入下载文件后即可使用。

本系列文章将结合两个《Java规范》进行总结,通过具体编码案例给出编码规范的原因,如果总结内容存在问题还望指出。


目录

1. 类名开始和结尾

2.拼音与英文混合命名

3.UpperCamelCase风格命名

4.lowerCamelCase风格命名

5.常量名命名

6.特殊类命名前缀和后缀

7.类型和括号位置

8.POJO类变量禁止命名方式

9.包名命名方式

10.变量重名


本篇文章总结的内容是Java开发规范的命名规范,主要涉及Java的类、方法、变量和包名等命名规范,对应阿里巴巴的Java开发手册的第一章第一节命名风格和谷歌Java开发手册第五章命名,该规范只是作为建议,具体实施过程可以根据场景变动。

1. 类名开始和结尾

【阿里巴巴】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。

【Google】标识符只能使用ASCII字母和数字,因此每个有效的标识符名称都能匹配正则表达式 \w+ 。

说明:虽然Java命名没有强制定义命名的字符,但是如果命名规范对后期代码阅读和维护有很大帮助。

反例:

【阿里巴巴】_name / __name / $name / name_ / name$ / name__

【Google】其它编程语言风格中使用的特殊前缀或后缀,如 name_ , mName ,s_name 和 kName ,在Java编程风格中都不再使用。

区别:Google规范要求更加严格,特殊前缀也无法使用

2.拼音与英文混合命名

【阿里巴巴】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,纯拼音命名方式更要避免采用。

正例:【阿里巴巴】renminbi / alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。

反例:【阿里巴巴】DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3

补充:这个问题可能是很多中国开发人员头疼的问题,不要着急,请参考 传送门1 和 传送门2

3.UpperCamelCase风格命名

【阿里巴巴】类名使用UpperCamelCase风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。

【Google】类名都以 UpperCamelCase 风格编写。

说明:该规范可以更好的识别命名的逻辑层次,区分每个英文单词和理解含义,不建议使用下划线等符号分隔单词

正例:【阿里巴巴】JavaServerlessPlatform / UserDO / XmlService / TcpUdpDeal / TaPromotion

反例:【阿里巴巴】javaserverlessplatform / UserDo / XMLService / TCPUDPDeal / TAPromotion

区别:无区别,应该是业界默认的要求,具体场景可以修正

4.lowerCamelCase风格命名

【阿里巴巴】方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式。

【Google】方法名、非常量字段名、参数名、成员变量、局部变量都以 lowerCamelCase 风格编写。

说明:该规范类似UpperCamelCase风格,不同是首字母小写

正例:【阿里巴巴】 localValue / getHttpMessage() / inputUserId

区别:谷歌规范更加严格,增加了非常量字段名的要求

5.常量名命名

【阿里巴巴】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。

【Google】常量名命名模式为 CONSTANT_CASE ,全部字母大写,用下划线分隔单词。

说明:常量需要和一般变量区分开,尽量使用好理解含义的命名方式

正例:【阿里巴巴】MAX_STOCK_COUNT / CACHE_EXPIRED_TIME

反例:【阿里巴巴】MAX_COUNT / EXPIRED_TIME  ——> 语义表达不清

6.特殊类命名前缀和后缀

【阿里巴巴】抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。

【Google】类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。测试类的命名以它要测试的类的名称开始,以 Test 结束。

说明:类名是最能直接反映类功能的,规范定义方便后期阅读和维护

7.类型和括号位置

【阿里巴巴】类型与中括号紧挨相连来表示数组。

【Google】数组的中括号是类型的一部分:String[] args, 而非String args[]

说明:虽然Java没有强制规定括号的位置,但类型紧跟括号更能体现数组类型或其他含义

正例:【阿里巴巴】定义整形数组int[] arrayDemo;

反例:【阿里巴巴】【Google】在main参数中,使用String args[]来定义。

8.POJO类变量禁止命名方式

【阿里巴巴】POJO类中布尔类型变量都不要加is前缀,否则部分框架解析会引起序列化错误。

说明:Spring会根据getter和setter来解析POJO类,如创建isXxx,那么自动生成的getter方法会是isXxx方法,然后解析时会去掉is变成Xxx。该规范是很多开发人员会犯的错误,发生问题再逐个debug非常浪费时间。

反例:【阿里巴巴】定义为基本数据类型Boolean isDeleted的属性,它的方法也是isDeleted(),RPC框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致属性获取不到,进而抛出异常。

9.包名命名方式

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

【Google】包名全部小写,连续的单词只是简单地连接起来,不使用下划线。

说明:包名反映了该包下所有类的功能含义,因此意义比较重要

正例:【阿里巴巴】应用工具类包名为com.alibaba.ai.util、类名为MessageUtils(此规则参考spring的框架结构)

区别:阿里巴巴规范更加严格,单词不能连接,点分隔符之间有且仅有一个自然语义的英语单词

10.变量重名

【阿里巴巴】避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名,使可读性降低。

说明:子类、父类成员变量名相同,即使是public类型的变量也是能够通过编译,而局部变量在同一方法内的不同代码块中同名也是合法的,但是要避免使用。对于非setter/getter的参数名称也要避免与成员变量名称相同。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章