Java代码规范

命名规范

类名采用大驼峰,一般为名词,如 ArrayList

方法名采用小驼峰,一般为动词,如 ArrayList的isEmpty()

变量采用小驼峰

常量的字母全部大写,单词之间用下划线连接

包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词,如 java.util.concurrent都是一个单词。包名统一使用单数,如果类名有复数含义,则可以使用复数形式

抽象类使用Abstract或Base开头;异常类使用Exception结尾;测试类名以测试类名开始,以Test结尾

类型与中括号紧挨来定义数组,如 int[]

枚举类名带上Enum后缀,枚举成员名全部大写,单词之间用下划线连接

复合语义下,尽量使用完整的单词组合来命名,如 KeyboardShortcutsHandler、AtomicReferenceFieldUpdater

常量

常量是在作用域内保持不变的值,一般用final关键字进行修饰,根据作用域区分,分为全局常量、类内常量、局部常量。全局常量是指类的公开静态属性,使用public static final修饰;类内常量是私有静态属性,使用private static final修饰;局部常量分为方法常量和参数常量,前者是在方法或代码块内定义的常量,后者是在定义形式参数时,增加final标识,表示此参数值不能被修改。全局常量和类内常量是最主要的常量表现形式,它们的命名方式比较特殊,采用字母全部大写、单词之间加下画线的方式。而局部常量采用小驼峰形式即可。

在常量中,拒绝使用魔法值。魔法值即“共识层面”上的常量,直接以具体的数值或者字符出现在代码中。这些不知所云的魔法值极大地影响了代码的可读性和可维护性。

举个栗子:

public void getonlinePackageCourse(Long packageId, Long userId) {

if (packageId == 3) {

logger.error("线下课程,无法在线观看");

return;

}

//其他逻辑处理

PackageCourse online = packageService.getByTeacherId(userId);

if (online.getPackageId() == 2) {

logger.error("未审核课程");

return;

}

//其他逻辑处理

}

以上示例代码中,信手拈来的2和3分别表示未审核课程和线下课程,仅仅是两个数字,似乎很容易记忆。但事实上除2和3两种状态外,还有1、4、5分别代表新建、审核未通过、审核通过。在团队规模较小时,口口相传,倒也勉强能够记住这五个数字的含义,早期还有零星的注释,驾轻就熟的情况下,连注释也省了。现实是残酷的,团队迅速扩大后,课程状态个数也在逐步增加,新来的开发在上线新功能模块时,把"审核通过"和"未审核课程"对应的数字搞反了,使得课程展示错误,导致用户大量投诉。随着应用变得越来越复杂,这些魔法值几乎成了整个后台服务代码中的梦魇。团队架构师终于下定决心进行系统重构,把这些魔法值以合适的命名方式定义成全局常量。使用Enum枚举类来定义课程类型,示例代码如下:

public enum CourseTypeEnum {

/**

* 允许官方和讲师创建和运营

*/

VIDEO_COURSE(1, "录播课程"),

/**

* 只允许官方创建和运营.初始化必须设置合理的报名人数上限

*/

LIVE_COURSE(2, "直播课程"),

/**

* 只允许官方创建和运营

*/

OFFLINE_COURSE(3, "线下课程");

private int seq;

private String desc;

CourseTypeEnum(int seq, String desc) {

this.seq = seq;

this.desc = desc;

}

public int getSeq() {

return seq;

}

public String getDesc() {

return desc;

}

}

上述示例代码把课程类型分成三种:录播课程、直播课程、线下课程。枚举类型几乎是固定不变的全局常量,使用频率高、范围广,所以枚举常量都需要添加清晰的注释,比如业务相关信息或注意事项等。再把课程状态分为新课程、未审核课程、审核通过、审核未通过、已删除五种状态。考虑到后续课程状态还会再追加,并且状态没有扩展信息,所以用不能实例化的抽象类的全局常量来表示课程状态,示例代码如下:

public abstract class BaseCourseState {

public static final int NEW_COURSE = 1;

public static final int UNAUTHED_COURSE = 2;

public static final int PASSED_COURSE = 3;

public static final int NOT_PASSED_COURSE = 4;

public static final int DELETED_COURSE = 5;

}

使用重构后的常量修改原有的魔法值:

public void getPackageCourse(Long packageId, Long userId) {

if (packageId == CourseTypeEnum.OFFLINE_COURSE.getSeq()) {

logger.error("线下课程,无法在线观看");

return;

}

VideoCourse course = packageService.getByTeacherId(userId);

if (course.getState() == BaseCourseState.UNAUTHED_COURSE) {

logger.error("未审核课程");

return;

}

}

某些公认的字面常量是不需要预定义的,如 for(int i = 0;...)这里的0是可以直接使用的。

true和false也可以直接使用,但是如果具备了特殊的含义,就必须定义有意义的名称。

变量

一般情况下变量的命名需要满足小驼峰格式,命名体现业务含义即可。存在一种特殊情况,在定义类成员变量时,特别是在POJO类中,针对布尔类型的变量,命名不要加is前缀,否则部分框架解析会引起序列化错误。例如,定义标识是否删除的成员变量为Boolean isDeleted,它的getter方法也是isDeleted(),框架在反向解析的时候, “误以为"对应的属性名称是deleted,导致获取不到属性,进而抛出异常。但是在数据库建表中,推荐表达是与否的值采用is_xxx的命名方式,针对此种情况,需要在中设置,将数据表中的is_xxx字段映射到POJO类中的属性Xxx。

展示风格

缩进、空格、空行

采用4个空格缩进

任何二目、三目运算符的左右两边都必须加一个空格

注释的双斜线与注释内容之间有且仅有一个空格

方法参数在定义和传入时,多个参数逗号后边必须加空格

没有必要增加若干空格使变量的赋值等号与上一行对应位置的等号对齐

如果是大括号内为空,则简洁地写成{}即可,大括号中间无须换行和空格

左右小括号与括号内部的相邻字符之间不要出现空格

左大括号前需要加空格

换行与高度

单行字符不超过120个,超出则需换行,换行遵循如下规约:

第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进

运算符与下文一起换行

方法调用的点符号与下文一起换行

方法调用中的多个参数需要换行时,在逗号后换行

在括号前不要换行

单个方法的总行数不超过80行。

除注释之外,方法签名、左右大括号、方法内代码、空行、回车及任何不可见字符的总行数,不超过80行。为什么是80行?心理学认为人对事物的印象通常不能超过3这个魔法数,三屏是人类短期记忆的极限,而80行在一般显示器上是两屏半的代码量。另外,通过对阿里代码抽样调查显示,只有不到5%的方法才会超过80行,而这些方法通常都有明显的优化空间。

控制语句

在 if、else、for、while、do-while等语句中必须使用大括号。即使只有一行代码,也需要加上大括号

在条件表达式中不允许有赋值操作,也不允许在判断表达式中出现复杂的逻辑组合。对于复杂的逻辑运算,可以赋值给一个具有业务含义的布尔变量。

// 不易于理解

if ((file.open(fileName, "w") != null) && (...) ||!(...)){

...

}

// 易于理解

final boolean existed = (file.open(fileName, "w") != null) && (...) ||!(...);

if (existed) {

...

}

多层嵌套不能超过3层。对于超过3层的if-else代码,可以使用卫语句、策略模式、状态模式来实现

卫语句示例:

public void today () {

if (isBusy()) {

System.out.println("change time.");

return;

}

if (isFree()) {

System.out.println("go to travel.");

return;

}

System.out.println("stay at home.");

return;

}

避免采用反逻辑运算符。如if (x < 1)而不是if (!(x >= 1))

代码注释

注释三要素

Nothing is strange

我们提倡写注释,然后才是写精简。

Less is more

从代码可读性及维护成本方面来讲,代码中的注释一定是精华中的精华。首先,真正好的代码是自解释的,准确的变量命名加上合理的代码逻辑,无须过多的文字说明就足以让其他工程师理解代码的功能。如果代码需要大量的注释来说明解释,那么工程师应该思考是否可以优化代码表现力。

Advance with the times

任何对代码的修改,都应该同时修改注释。

注释格式

Javadoc注释

类、类属性和类方法的注释必须遵循Javadoc规范,使用文档注释(/*/)的格式。

对枚举的注释是必需的。有人觉得枚举通常带了String name属性,已经简要地说明了这个枚举属性值的意思,此时注释是多余的。其实不然,因为:

注释的内容不仅限于解释属性值的含义,还可以包括注意事项、业务逻辑。如果在原有枚举类上新增或修改一个属性值,还需要加上创建和修改时间,让使用者零成本地知道这个枚举类的所有意图

枚举类的删除或者修改都存在很大的风险。不可直接删除过时属性,需要标注为过时,同时注释说明过时的逻辑考虑和业务背景

简单注释

简单注释包括单行注释和多行注释。此类注释不允许写在代码后方,必须写在代码上方,这是为了避免注释的参差不齐,导致代码版式混乱。双画线注释往往使用在方法内部,此时的注释是提供给程序开发者、维护者和关注方法细节的调用者查看的。因此,注释的作用更应该是画龙点睛的,通常添加在非常必要的地方,例如复杂算法或需要警示的特殊业务场景等。

java 换行规范_Java代码规范相关推荐

  1. java代码规范插件_「Java基础知识」代码规范插件怎么用

    原标题:「Java基础知识」代码规范插件怎么用 在开发中,好的编程风格可以提升团队合作能力,提升开发的效率,但是每个人都有自己的编程习惯,如何能够将大家的编程风格统一,这个在团队中也很重要; 在Jav ...

  2. java代码解决的问题_java代码规范问题及解决方案

    java代码规范问题总结 1.没有总是检查ResultSet结果对象 解决方案是通过if判断ResultSet结果是有有元素,常用条件是ResultSet结果的next,previous,first, ...

  3. Java开发 高可维护性代码规范

    目录 理念与目标 实施目的 关于阿里代码规约 术语 接口方法 功能点方法 子功能点方法 业务逻辑片段方法 实体转换方法 业务方法 rpcservice层 VO(View Object) BO(Busi ...

  4. 玩物得志Java笔试题_代码规范利器-CheckStyle

    本期内容分为五个部分,阅读时长预估7分钟: 使用背景 CheckStyle使用意义 CheckStyle安装与使用 CheckStyle检查配置示例 落地使用情况及效果 使用背景 玩物得志目前还处在一 ...

  5. java高级规范_Java高级规范之二

    二十一.提交java代码前应该检查是否有没用的语句,如:System.out.println(); jsp页面上面是否有alert调试信息 不规范示例:暂无 规范实例:暂无 解析:因为如果保留了有可能 ...

  6. java的书写规范_java书写规范以及技巧

    一. Java命名的一般性指导 1. 类名首字母应该大写.属性(成员变量).方法.对象变量以及所有标识符(如形式参 数.实际参数.局部变量)的首字母应小写,其中包含的所有单词都应紧靠在一起,而 且大写 ...

  7. java的注释规范_Java 注释规范

    基本的要求: 1.注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释.如果在其它项目中发现它们的注释规范与这份文档不同,按照这份规范写代码,不要试图在既成的规范系统中引入新的规范 ...

  8. java中换行符_Java代码中的换行符有哪几种?区别是什么?

    近年来学习java的人是越来越多,毕竟市场上的需求特别的大,但是在学习Java编程的时候,大家是不是会与代码打交道,我们大家也都知道,我们上学的时候写的笔记是不是一行一行的呢?代码也是但是做程序的人都 ...

  9. c++ doxygen 注释规范_[代码规范]Go语言编码规范指导

    本规范旨在为日常Go项目开发提供一个代码的规范指导,方便团队形成一个统一的代码风格,提高代码的可读性,规范性和统一性.本规范将从命名规范,注释规范,代码风格和 Go 语言提供的常用的工具这几个方面做一 ...

  10. jsp文件命名规范_代码规范整理

    我喜欢优雅和高效的代码.代码逻辑应当直截了当,叫缺陷难以隐藏:尽量减少依赖关系,使之便于维护:依据某种分层战略完善错误处理代码:性能调至最优,省的引诱别人做没规矩的优化,高出一对混乱来.整洁的代码只做 ...

最新文章

  1. matlab创建符号常量出错,错误:代码中意外的符号/输入/字符串常量/数值常数/特殊...
  2. 托盘图标菜单_全新开始菜单和任务栏,Windows 10X 抢先体验
  3. python的按钮控件_python实现360皮肤按钮控件示例
  4. 无代理备份和应用程序感知
  5. HADOOP基本操作命令,及其组件端口
  6. 东北大学 最优化期末复习 简答题总结
  7. 设计模式---003代理模式---【巷子】
  8. java xsi type_java – JAXB – 如何根据XML值设置XML元素的xsi:type?
  9. 89c51交通灯汇编语言程序,89C51单片机交通灯汇编程序
  10. vue添加响应response拦截器,响应登陆超时处理
  11. 【货位优化】基于遗传算法实现仓库货位优化问题含Matlab源码
  12. Webmax简易入门操作手册(二)
  13. excel max函数的使用
  14. 轻量级私有云存储企业主要功能探析
  15. 补天白帽大会五大热点前瞻
  16. window创建l2tp
  17. Xshell配色方案
  18. idea自定义过滤器
  19. FDTD 中石墨烯材料如何设置
  20. ubuntu10.04下设置桌面特效

热门文章

  1. IPTV 行业机顶盒EPG关键点
  2. 淘宝搜索算法综述之一:淘宝搜索的特点
  3. 完整安装minidwep-gtk教程
  4. CDlinux如何制作U盘启动(附带Minidwep-gtk工具)
  5. 深度学习 个人理解使用余弦相似度对人脸图片识别的过程
  6. php镜像站群_【镜像站群系统】2020最新单域名PHP网站克隆镜像网站程序源码
  7. innerHTML和outerHTML区别
  8. Postman下载及安装详细教程
  9. 永洪BI配置GIS地图的方法
  10. linux rtl8723bu 蓝牙,RTL8723DS蓝牙问题分析