JAVA开发中,我们经常会为如何来命名烦心。
有大神曾说计算机科学的两件难事:缓存失效和命名

的确,程序员最头疼的事:命名

但其实,有规范可以遵循。还有工具帮我们取名,更有插件帮我们实时检查是否违反规范。

文章目录

  • 阿里java命名规范
    • (一) 命名风格
    • (二) 常量定义
  • IDEA 命名规范检查插件
    • 安装
  • 取名工具
    • CodeIf
      • chrome便捷搜索 [^1]
    • 自动命名工具网站

阿里java命名规范

取自《阿里巴巴JAVA开发手册》。

以下是约定内容。

(一) 命名风格

  1. 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。

反例:name / name / name/name/namename / name / namename/name/name / name

  1. 【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

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

正例:ali / alibaba / taobao / cainiao/ aliyun/ youku / hangzhou 等国际通用的名称,可视同英文。

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

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

正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion

反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion

  1. 【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格。

正例: localValue / getHttpMessage() / inputUserId

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

正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME

反例:MAX_COUNT / EXPIRED_TIME

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

  2. 【强制】类型与中括号紧挨相连来表示数组。

正例:定义整形数组 int[] arrayDemo;

反例:在 main 参数中,使用 String args[]来定义。

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

说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的值采用 is_xxx 的命名方式,所以,需要在设置从 is_xxx 到 xxx 的映射关系。

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

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

正例:应用工具类包名为 com.alibaba.ei.kunlun.aap.util、类名为 MessageUtils(此规则参考 spring 的框架结构)

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

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

反例:

public class ConfusingName {public int stock;// 非 setter/getter 的参数名称,不允许与本类成员变量同名public void get(String alibaba) {if (condition) {final int money = 666;// ...}for (int i = 0; i < 10; i++) {// 在同一方法体中,不允许与其它代码块中的 money 命名相同final int money = 15978;// ...}}
}
class Son extends ConfusingName {// 不允许与父类的成员变量名称相同public int stock;
}
  1. 【强制】杜绝完全不规范的缩写,避免望文不知义。

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

  1. 【推荐】为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达。

正例:在 JDK 中,对某个对象引用的 volatile 字段进行原子更新的类名为:AtomicReferenceFieldUpdater。

反例:常见的方法内变量为 int a;的定义方式。Java 开发手册

  1. 【推荐】在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。

正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT

反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD

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

说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。

正例:

public class OrderFactory;

public class LoginProxy;

public class ResourceObserver;

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

正例:接口方法签名 void commit();

接口基础常量 String COMPANY = “alibaba”;

反例:接口方法定义 public abstract void f();

说明:JDK8 中接口允许有默认实现,那么这个 default 方法,是对所有实现类都有价值的默认实现。

  1. 接口和实现类的命名有两套规则:

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

正例:CacheServiceImpl 实现 CacheService 接口。

2)【推荐】如果是形容能力的接口名称,取对应的形容词为接口名(通常是–able 的形容词)。

正例:AbstractTranslator 实现 Translatable 接口。

  1. 【参考】枚举类名带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。

说明:枚举其实就是特殊的常量类,且构造方法被默认强制是私有。

正例:枚举名字为 ProcessStatusEnum 的成员名称:SUCCESS / UNKNOWN_REASON。

  1. 【参考】各层命名规约:

A) Service/DAO 层方法命名规约

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

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

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. 【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

反例:

//本例中同学 A 定义了缓存的 key,然后缓存提取的同学 B 使用了 Id#taobao 来提取,少了下划线,导致故障。

String key = “Id#taobao_” + tradeId;

cache.put(key, value);

  1. 【强制】在 long 或者 Long 赋值时,数值后使用大写的 L,不能是小写的 l,小写容易跟数字混淆,造成误解。

说明:Long a = 2l; 写的是数字的 21,还是 Long 型的 2。

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

说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解,也不利于维护。

正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 ConfigConsts 下。

  1. 【推荐】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。

1) 跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下。

2) 应用内共享常量:放置在一方库中,通常是子模块中的 constant 目录下。

反例:易懂变量也要统一定义成应用内共享常量,两位工程师在两个类中分别定义了“YES”的变量:

类 A 中:public static final String YES = “yes”;

类 B 中:public static final String YES = “y”;

A.YES.equals(B.YES),预期是 true,但实际返回为 false,导致线上问题。

3) 子工程内部共享常量:即在当前子工程的 constant 目录下。

4) 包内共享常量:即在当前包下单独的 constant 目录下。

5) 类内共享常量:直接在类内部 private static final 定义。

  1. 【推荐】如果变量值仅在一个固定范围内变化用 enum 类型来定义。

说明:如果存在名称之外的延伸属性应使用 enum 类型,下面正例中的数字就是延伸信息,表示一年中的第几个季节。

正例:

public enum SeasonEnum {SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);private int seq;SeasonEnum(int seq) {this.seq = seq;}public int getSeq() {return seq;}
}

IDEA 命名规范检查插件

大家应该都听过阿里巴巴的Java开发手册,里面规范了代码风格的各种行为规范,这个插件就是自动规范你的代码风格。

安装

打开IDEA,打开File->Setting菜单

找到插件(plugin
搜索Alibaba Java Coding Guidelines

安装第一个(我这里已安装成功)。安装完成后,会提示重启IDEA。

如果开启了实时检测,在代码中不规范的部分将直接波浪线或者红线警告。


如果命名不符合阿里的命名规范,则会提示你进行修改(修改会用IDEA的重构的命名方式,所以,不用担心会影响其他地方引用过这个变量的问题)。

取名工具

如果我们不知道该如何取名,有一个取名神器介绍给大家CODELF

CodeIf

Codelf通过搜索在线开源平台Github, Bitbucket, Google Code, Codeplex, Sourceforge, Fedora Projec的项目源码,帮开发者从中找出已有的匹配关键字的变量名。这个搜索服务支持直接搜索中文。codeif支持中文查询,输入中文意思,codeif可以根据需要查询尽可能满足需要的结果,并展示与查询结果相关的支持各种编程语言的代码片段以及代码库。

链接:http://unbug.github.io/codelf/

当查询到后,选择自己想要的就可以直接拷贝。

chrome便捷搜索 1

chrome配置如下(codelf是名称随便取,e是快捷提示符,最后是搜索网址请保持一致)

codelf e http://unbug.github.io/codelf/#%s


按e后输入空格或者tab按键,再输入你要搜索的内容

相关说明及插件:https://github.com/unbug/codelf

自动命名工具网站

当取了名字后,我们如何针对变量名,类名,还有接口名,以及在架构中命名等,我们可以使用以下网站。
rcode命名神器


会自动为各种变量名,方法名以及类名对象名进行命名。而且是符合阿里JAVA命名规范的。
而且还可以按不同的语言来进行取名


  1. 变量取名一键直达——Codelf ↩︎

关于java变量命名,介绍阿里JAVA命名规范及IDEA实时检测插件的使用以及CODELF取名神器相关推荐

  1. jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做?

    在jsp中经常会遇到把js变量赋给java变量,或者将java变量赋给js变量的情况,在此将通用的处理方法小结如下: java变量传给js好办,var a="<%=javaParam% ...

  2. jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做

    在jsp中经常会遇到把js变量赋给java变量,或者将java变量赋给js变量的情况, 值得一提的是:两者确实有办法可以相互赋值,但有局限性:[原因如下] jsp脚本是服务器端脚本--页面一加载就会随 ...

  3. java 获取文件大小_阿里Java后端开发面经,面试官都替我感到绝望

    点关注,不迷路:持续更新Java相关技术及资讯!!! 内容源于群友投稿!记录一次阿里Java后端开发面经,分享给大家,感谢支持! 前言 秋招面试的第一家公司,也是第一次面试,真的超级紧张,从自我介绍到 ...

  4. 面试java回答优缺点_阿里Java开发面经分享,面试题(附回答)

    下面要给大家分享一个阿里Java开发面经,里面包含了具体的问题,以及相关回答,主要包括了数据库.操作系统.项目相关.java基础.数据结构.计算机网络等内容. 一.数据库 1.为什么在项目中用Mong ...

  5. 阿里java工程师要求_阿里Java P系列技术要求(P5-P7)

    阿里p系列薪资(最新数据比这个高1倍左右) 阿里P5(高级研发工程师) 工作要求: 能独立完成日常工作,并能够对一些方案提出自己的建议. 基本考核就是能上手独立完成工作,熟练掌握. 技能要求(熟练): ...

  6. java mongodb存base64_阿里JAVA面试分享经验【文末有福利】

    基础篇 参考这里的面试题:面试题写在后面了 能回答上百分之七十,基础的广度就算OK了.如果达不到,那么缺什么就赶紧补什么.广度达到了,还需要对个别热点问题有深度.每个人的精力都有限,可以适当挑选两个热 ...

  7. 2021年Java面试心得:阿里java开发面试

    零基础如何学习Java? 首先,你要明白一点,Java入门不难! 无论你是从事哪个行业,兴趣一定是最好的老师,也是你学习的动力. 学习方式1:自学 自学模式其实我个人不建议绝大部分的人选择,因为自学是 ...

  8. 中软国际Java机试,阿里Java算法题

    拼多多三面惨败,java中间件.数据库与spring框架,答不上- 面试开火箭,工作拧螺丝-月初有个朋友面试拼多多,一面自信满满过了,结果三面却惨败-昨天朋友约我出来讨论问题在哪里,三面就答不上了(卡 ...

  9. java变量同名_浅析Java中局部变量与成员变量同名解决技巧

    要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中 ...

最新文章

  1. vs2017开发Node.js控制台程序
  2. react-native 签名
  3. 诺基亚Lumia 800生产背后的故事——萨罗工厂[多图]
  4. tensorflwo-gpu win10_64bit 的安装版本问题
  5. 机器学习cae_CAE工程分析技术年会记
  6. 自我分析colly的robots源码
  7. JPA – Hibernate –包级别的类型映射
  8. NodeMedia / NodeMediaClient-Android(一个简单,快速,免费的直播SDK)
  9. 串口发送接收浮点型数据
  10. Seata分布式事务问题由来---微服务升级_SpringCloud Alibaba工作笔记0056
  11. avast高级版许可文件_明道云私有部署版已上架腾讯云镜像市场
  12. LPC1768 Flash 存储器加速模块
  13. yeezy350灰橙_Yeezy 350V2 Grey Orange 侃爷椰子350 灰橙 特价
  14. linux 用7zip解压rar,Linux7-rar文件的压缩及解压方法
  15. 国外赛事直播加速案例
  16. CTF 每日一题 Day24 世上无难事
  17. strcmp wcscmp stricmp wcsicmp
  18. 八大渲染引擎(如VRAY)的分析
  19. 《张成功项目管理记》一导读
  20. 互联网创业时代先锋 :微合娱乐网创办人潘华鹏

热门文章

  1. 什么是体、性、用、相?
  2. 40G以太网光模块解决方案
  3. pc调试微信h5页面提示Pending authentication:please accept debugging session on the device的解决方法
  4. JS —— 5、数据交互、跨域
  5. TP开发的源码或素材付费下载站网站源码+整体不错
  6. 【ARM Cache 入门及渐进五--内存屏障ISB/DSB/DMB】
  7. 有什么免费的思维导图软件可以推荐?
  8. Window10 系统 把图片制作成视频
  9. HDMI转Displayport转换器支持4K分辨率
  10. CUDA 学习(CUDA实战 第四章)