Java代码规范

一、前言

学习了《阿里巴巴Java开发手册》,对自己的代码规范进行了改进,根据自己不足,摘录一些内容并记录,方便以后查阅。

二、笔记

命名

1.代码中的命名不能以下划线或美元符号开头和结尾。
2.代码中命名不能使用拼音和英文的混合方式,不能直接使用中文命名,尽量避免纯拼音的命名方式。
3.类名的命名使用首字母大写的驼峰命名方式。
4.方法、参数、变量名使用首字母小写的驼峰命名方式。
5.常量名全部大写,单词间使用下划线隔开,并做到见名知义。
6.抽象类名应以Abstract或Base开头,异常类命名使用Exception结尾;测试类以要测试的类名称开头,以Test结尾。
7.表示数组中括号紧挨着类型。
8.POJO类中布尔类型的变量,不要加is前缀,否则部分框架解析会引起序列化错误。
9.包名统一使用小写,点分割之间只用一个英语单词;包名统一使用单数形式;类名有复数含义时,可以采用复数形式。
10.不要有不完全、不易懂的缩写,要做到见名知义。
11.自定义编程元素命名时,使用完整的单词组合来表达意思。
12.模块、接口、类、方法使用了设计模式时,在命名时需要体现出具体模式。
13.接口中方法和属性不要加任何修饰符号;并加上有效的Javadoc注释;尽量不要在接口里定义变量,如果一定要定义变量,这个变量肯定与接口的方法有关,而且是整个应用的基础常量。
14.接口和实现类的命名有两套规则:
(1)对于Service和DAO类,基于SOA理念,暴露出来的一定是接口,内部的实现类用户Impl的后缀与接口来区别。
(2)如果是形容能力的接口名称,取对应的形容词为接口名(通常是-able形式)
15.枚举类名建议带上Enum后缀,枚举成员名称需要大写,单词间用下划线隔开。
16.各层命名规约:
(1)Service/DAO层方法命名规约
- 获取单个对象的方法用get做前缀
- 获取多个对象的方法用list做前缀
- 获取统计值的方法用count做前缀
- 插入的方法用sava/insert做前缀
- 删除的方法用remove/delete做前缀
- 修改的方法用update做前缀
(2)领域模型命名规约
- 数据对象:xxxDO,xxx即为数据表名
- 数据传输对象:xxxDTO,xxx为业务领域相关的名称
- 展示对象:xxxVO,xxx一般为网页名称
- POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO

常量

1.不允许任何未经预先定义的常量直接出现在代码中
2.在long或者Long赋值时,数值后使用大写的L,不能时小写的l,以免跟数字1混淆,造成误解
3.不要使用一个常量类维护所有的常量,应该把常量按功能分类,这样更方便于管理。

代码格式

代码格式更多是时注重代码美观和便于理解查看,这要平时编辑时就养成良好习惯,这里就不过多叙述了;现在的流行集成开发环境大多有一键格式化代码的功能:
eclipse :Ctrl+Shift+F
IDEA :Ctrl+Alt+L

OOP

1.避免通过一个类的对象引用访问此类的静态变量或静态方法,直接使用类名来访问静态变量或方法。
2.所有覆写的方法,必须叫@Override注解
3.不能使用过时的类或方法
4.Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals
5.所有相同类型的包装类对象之间值的比较,全部用equals方法比较
6.基本数据类型与包装数据类型的使用标准如下:
(1)所有的POJO类属性必须使用包装数据类型
(2)RPC方法的返回值和参数必须使用包装数据类型
(3)所有的局部变量使用基本数据类型
7.定义DO/DTO/VO等POJO类时,不要设定任何属性默认值
8.序列化类新增属性时,不要修改serialVersionUID字段,避免反序化失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值
9.构造方法里面进制加入任何业务逻辑,如果有初始化逻辑,请放在init方法中
10.POJO类中必须写toString方法,如果继承了另一个POJO类,注意在前面加一下super.toString
11.当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起
12.类内方法定义的顺序依次是:public或protected>private>getter/setter
13.循环体内,字符串的链接方式,使用StringBuilder的append方法进行扩展
14.慎用Object的clone方法来拷贝对象,因为对象的clone默认是浅拷贝,若想实现深拷贝需要重写clone方法实现域对象深度遍历式拷贝
15.工具类不允许有public或default构造方法

集合

1.关于hashCode和equals的处理,遵循如下规则:
(1)只要重写equals,就必须重写hashCoden
(2)Set存储的对象必须重写hashCode和equals方法
(3)如果自定义对象作为Map的键,那么必须重写hashCode和equals
2.ArrayList的subList结果不可强转成ArrayList,否则会抛出数据类型转换异常。subList方法返回的不是ArrayList,而是ArrayList的内部类SubList
3.在subList场景中,对原集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生ConcurrentModificationException异常
4.使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()
5.不要再foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方法,并发操作请对Iterator对象加锁
6.注意Map类集合K/V能不能存储null值的情况,如下表格:

集合类 Key Value Super 说明
Hashtable 不允许为null 不允许为null Dictionary 线程安全
ConcurrentHashMap 不允许为null 不允许为null AbstractMap 锁分段技术(JDK8:CAS)
TreeMap 不允许为null 允许为null AbstractMap 线程不安全
HashMap 允许为null 允许为null AbstractMap 线程不安全

控制语句

1.在高并发场景中,避免使用”等于“判断作为中断或退出的条件;在并发控制没处理好的场景下,可能出现等值被击穿的情况,使用大于或小于区间判断条件来代替
2.表达异常分支时,少用if-else方式,非使用不可情况下,不能超过3层;超过3层的可以使用卫语句、策略模式、状态模式来实现
3.不要再条件判断中执行其他复杂的语句,将复杂的逻辑判断的结果赋值给一个有意义的布尔变量名,提高代码的可读性
4.循环体中的语句要尽量考虑性能,定义对象、变量、获取数据库连接、不必要的try—catch操作尽量移至循环体外处理

注释

1.类、类属性、类方法的注释必须使用Javadoc规范,不得使用单行注释
2.所有的抽象方法,必须要用Javadoc注释,除了返回值、参数、异常说明外、还必须指出该方法做什么事情,实现什么功能
3.所有的类都必须添加创建者和创建日期
4.方法内部单行注释,再被注释语句的上方;方法内部多行注释使用/* */注释,与代码对齐
5.所欲的枚举类型字段必须要有注释,说明每个数据项的用途
6.英文不好的就用中文注释;专有名词与关键字保持英文原文即可
7.修改代码的同时,注释也要随之修改
8.需要注释掉的代码,再上方详细说明,而不是简单的注释掉;无用的代码请删除
9.对于注释的要求:
(1)要准确反应设计思想和代码逻辑
(2)能够描述业务含义,使别的程序员能够迅速了解到代码背后的信息
10.好的命名、代码结构式自解释的,注释力求精简准确、表达到位。避免出现注释的一个极端:过多过滥的注释,一旦修改代码,修改注释的负担就会很大

《阿里巴巴Java开发手册》github英文版链接:https://github.com/alibaba/p3c/tree/master/p3c-pmd

《阿里巴巴Java开发手册》下载链接:https://yq.aliyun.com/download/2720?utm_content=m_1000019584

posted @ 2020-08-15 22:29  cqy19951026  阅读(214)  评论(0编辑  收藏  举报