java代码参考规范
来源:互联网 发布:淘宝网1 8米纯棉床罩 编辑:程序博客网 时间:2024/05/19 23:09
一、命名规约
1.代码中的变量命名一律不允许以下划线或美元符号开头或结尾。
- 反例:_name/name_/$name/name$
2.代码中的命名禁止使用汉语拼音和英文混合的方式,纯拼音的方式也尽量不用, 除非特殊情况请给出注释。某些国际通用的名称如alibaba/youku/beijing等可视为英文,但是如QQ等一律使用小写qq命名。
- 反例:getPingfenByName()
3.包的命名一律以com.bw开头,包名一律使用小写,点分隔符之间有且仅有一个自然语义的单词,不能包含特殊字符。包的划分要详细清晰,不要怕多。
4.类名使用UpperCamelCase风格(首字母大写),遵从驼峰形式。
正例:UserService
反例:userService/XMLService
5.方法名、变量名使用LowerCamelCase风格(首字母小写),遵从驼峰形式。
- 正例:getUsers()/enterUserId
6.类的命名尽量加上某些前缀或后缀以明确表达该类的功能,如果不能明确,切不可乱加前后缀。
- 前缀
- 前缀
前缀名 描述 举例 Abstract抽象类AbstractBeanFactoryBase基础类(提供常用方法)BaseDaoDefault默认类(对某接口的默认实现)DefaultAopProxyFactory- 后缀
后缀名 描述 举例 Service表明这个类是个服务类,里面包含了给其他类提同业务服务的方法PaymentOrderServiceImpl这个类是一个实现类,而不是接口PaymentOrderServiceImplDao这个类封装了数据访问方法PaymentOrderDaoListener响应某种事件的类PaymentSuccessListenerAction直接处理页面请求,管理页面逻辑了类UpdateOrderListActionFilter这个类是过滤器EncodingFilterEvent这个类代表了某种事件PaymentSuccessEventServlet一个ServletPaymentCallbackServletFactory生成某种对象工厂的类PaymentOrderFactoryAdapter用来连接某种以前不被支持的对象的类DatabaseLogAdapterJob某种按时间运行的任务PaymentOrderCancelJobWrapper这是一个包装类,为了给某个类提供没有的能力SelectableOrderListWrapperBean这是一个POJOMenuStateBeanException异常类ErrorParametersException7.常量命名要全部大写,单词间用下划线分隔,要求语义表达完整,不要嫌名字长。
8.数组定义一律采用String[] args这种方式,不可使用String args[]的定义方式。
9.POJO类中布尔类型的变量不要加is,否则部分框架解析会引起序列化错误。
- 正例:boolean success
- 反例:boolean isSuccess
10.每一个POJO类要给出toString()方法,便于打印日志或者查找bug。
11.接口类中的方法不要加任何修饰符号,保持代码简洁性。尽量不要在接口中定义变量。
正例:void sayHello()
反例:public void sayHello()
12.枚举类名建议带上Enum后缀,枚举成员名称要全部大写,单词间用下划线隔开。
- 正例:枚举类名:DealStatusEnum,成员名称:SUCCESS / UNKNOWN_REASON
13.Service/Dao层方法命名规约:
1) 获取单个对象用get做前缀;
2) 获取多个对象用list做前缀;
3) 获取统计值的方法用count做前缀;
4) 插入方法用save或insert做前缀;
5) 删除方法用remove或delete做前缀;
6) 修改方法用update做前缀。
14.long或者Long类型赋值时,必须使用大写的L,不能使用小写的l,避免和数字1造成混淆。
- 正例:Long a = 2L
- 反例:Long a = 2l
15.不要使用一个常量类来维护所有的常量,如果常量过多不利于维护。应该按照常量的功能进行分类,分开定义和维护。比如与缓存相关的常量定义在CacheConsts下;系统配置相关的常量定义在ConfigConsts下。
16.杜绝不规范的缩写,避免望文不知义。
- 反例:AbstractClass缩写为AbsClass,此类随意的缩写会严重降低代码的可阅读性
二、格式规约
1.大括号的使用约定:如果大括号内为空,则直接间接的写成{},不需要换行;如果是为空代码块,则:
1) 左大括号前不换行,左大括号后换行;
2) 右大括号前换行;
3) 右大括号后还有else等代码则不换行。
2.左括号与后一个字符之间不加空格,右括号与前一个字符之间不加空格。
3.if/for/while/switch/do等关键字与左右括号之间加空格。
4.任何一个运算符左右两边加空格。
说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三目运算符等。
5.单行字符数不宜超过120个,超出则需要换行,换行是遵循以下规则:
1) 第二行相对于第一行缩进4个空格,从第三行开始不在继续缩进;
2) 运算符与下文一起换行;
3) 方法调用的点号与下文一起换行;
4) 多个参数超长,在逗号后进行换行;
5) 在括号前不要换行
正例:
StringBuffer sb = new StringBuffer();
sb.append(“a”).append(“b”)...
.append(“c”)...
.append(“d”);
反例:
StringBuffer sb = new StringBuffer();
sb.append(“a”).append(“b”)...append
(“c”);
6.IDE中的text file encoding 设置为UTF-8。
7.建议方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间插入一个空行。相同的业务逻辑和语义之间不需要插入空行。
8.每个文件不超过2000行,避免将所有方法放到一个类中,影响问题查找和代码阅读。
三、编码规约
1.不要通过一个类的对象来访问该类的静态变量或静态方法,直接通过类名访问即可。
2.不要使用过时的类或者方法。
说明:java.net.URLDecoder 中的decode(String encodeStr)方法已经过时,应该使用decode(String source,String encode)方法。
3.Object的equals方法容易产生NPE问题,应该使用常量或者确定有值的对象来调用equals。
正例:”test”.equals(object)
反例:object.equals(“test”)
说明:推荐使用java.util.Objects#equals(JDK7引入的工具类)
4.所有包装类对象之间值的比较全部使用equals方法。
5.基本数据类型与包装类型的使用标准如下:
1) 所有的POJO类属性必须使用包装类型;
2) RPC接口的返回值和参数必须使用包装类型;
3) 方法中所有的局部变量使用基本数据类型。
6.构造方法里面不要加入任何业务逻辑,如果有业务逻辑,放到init方法中。
7.当一个类中有多个构造方法或者同名方法时,按照顺序放置在一起,便于阅读。
8.类方法应最小化访问权限。
说明:能用protected的就不要用public。不要将所有的方法都设为public。
9.循环体内的字符串连接使用StringBuilder的append方法。
10.对集合List循环遍历之前,除非明确该集合肯定不为空,否则一定要做非空判断。
11.不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
12.使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。
13.利用Set元素唯一的特性,可以快速对一个集合进行去重操作,避免使用List的contains方法进行遍历、对比、去重操作。
14.在switch块内,每一个case要么通过break/return等来终止,要么注释说明程序将执行到哪个case为止;每一个switch都必须包括default并且放在最后,即使什么代码也没有。
15.条件语句都必须使用大括号,即使只有一行代码,避免使用单行的形式。 \
- 反例:if ( condition ) statements
16.表达异常的分支时,少用if-else方式,这种方式可以改写成:
If(condition) {
......
return obj;
}
//接着写else的业务逻辑代码
说明:如果非要使用if()...else if()...else...方式表达逻辑,不要超过3层,避免代码维护困难。
17.条件判断中不要执行过于复杂的语句,将复杂逻辑判断赋值给一个有意义的布尔变量名,以提高可读性。
18.循环体内的语句要注意考量性能,比如定义对象、变量、获取数据库连接、进行不必要的try-catch操作等尽量移至循环体外处理。
19.在类、类属性、类方法的注释必须使用javadoc规范,即使用/*内容/格式,不得使用//XXX的方式。
20.所有的抽象方法(包括接口中的方法)都必须用javadoc注释,并且说明该方法的功能。
21.方法内部单行注释,在被注释语句上方另起一行,用//注释;多行注释使用/* */注释,与代码对齐。
22.代码修改的同时,也要修改相应的注释,避免代码已经修改了多版,但注释还是第一版,导致注释与代码严重不符。
23.建议任何数据结构的构造或初始化,指定初始化大小。
24.不要尝试通过异常来进行流程控制,条件控制,因为异常的处理效率比条件分支低。
25.不要对大段代码进行try-catch。要尽量分清稳定代码和非稳定代码。
26.捕获到异常不要什么都不做,如果不想处理它,请向上抛出。
27.不能在finally块中使用return,finally块中的return返回后方法结束,不会再执行try块中的return语句。
28.方法如果返回null时,要特别注释说明什么情况下会返回null,调用者需要进行非空判断防止NPE问题。
29.避免出现大量重复性的代码。
30.在方法的有效输入、输出和关键位置要打印有意义的日志,对于问题的排查有好处。打印日志请使用log.info(),避免使用System.out.println()。
31.数据库中小数类型为decimal,不要使用float和double。
说明:float和double在存储的时候存在精度损失的问题,很可能在值的比较时得不到正确的结果。
32.代码中涉及到小数的运算时,尤其是跟钱有关时,一定要使用BigDecimal进行操作,否则会造成精度缺失,数据错误。
33.方法的参数不宜过多,当超过6个参数时,应将参数封装成一个类来使用。
34.异常的捕获或者抛出不要都使用java.lang.Exception,要对具体的异常进行细分。
35.方法中的参数不要在方法体内对其进行重新赋值,要想使用方法中的变量值,要重新定义变量进行赋值。
36.同一行中不要声明多个变量。
- 正例:int a=0;
Int b=1;
- 反例:int a=0;b=1;
37.复写的方法一定要加@Override注解。
38.Pojo类中的成员变量不要定义默认值。
39.一个类中的各个组件定义顺序如下:
静态变量->私有变量->构造方法->公有方法->保护方法->私有方法->set/get方法
40.重写equals方法的同时要重写hashCode方法。
- java代码参考规范
- android开发 代码规范参考
- c代码规范(参考)
- Android代码规范参考指南
- Android代码规范参考指南
- 【Android】代码规范参考指南
- JAVA/JSP编程规范参考
- Java项目开发规范参考
- Java语言编码规范(参考)
- C语言代码书写规范[参考]
- Extjs4前端开发代码规范参考
- Django Web项目代码规范参考
- android(安卓)代码规范参考指南
- 开发规范: JAVA代码规范
- Java bean validation 规范与参考实现
- java代码书写规范
- java开发代码规范
- JAVA代码编程规范
- 剑指offer 29 数组中出现次数超过一半的数字
- spring集成redis
- Java设计模式_(创建型)_原型模式
- 微擎0.7功能解析:性能优化、读写分离、负载均衡、附件分离
- c++ 11 tuple实现
- java代码参考规范
- I2C
- HashMap全解析
- Python与设计模式(一)——Abstract Factory
- bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
- JDK源码学习(jdk1.8)
- Dubbo 管理页面的部署
- iOS-从任何一个view中获得当前控制器
- CSR是什么样的公司?CSR蓝牙芯片有何过人之处?