- 编程规约
命名风格:
1、代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。正确的英文拼写和语法可以让阅读者易于理解,避免歧义。
正例:alibaba /taobao /youku
反例:DaZhePromotion[打折]/getPingFenByName()[评分]
2、方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式。
正例:localValue /getHttpMessage() /inputUserId
3、POJO类中布尔类型的变量尽量不要加is前缀,否则部分框架解析会引起序列化错误。
反例:定义基本数据类型Boolean isDeleted;
4、杜绝完全不规范的缩写,避免词不达义。
反例:AbstractClass“缩写”命名成AbsClass,condition“缩写”命名成condi,此类随意缩写严重降低了代码的可读性。
5、接口类中的方法和属性不要添加任何修饰符号(public也不要加),保持代码的简洁性。
正例:接口方法签名:void commit();如下是一个实际项目中的接口方法
public interface UserService {
/**
* 添加用户
* @param user
*/
int addUser(User user);
}
6、接口和实现类的命名有两套规则:
对于Service和DAO类,基于SOA的理念,暴漏出来的服务一定是接口,内部的实现类用Impl后缀与接口区别。
正例:CacheServiceImpl实现CacheService接口
拓展:Service层分为接口类和实现类两层的目的是什么?
面向接口的开发,多人分模块开发时,写service(业务层)的人将接口定义好之后,其它层的人直接可以调用接口方法,而写service层的人也可以通过实现类写具体方法逻辑,达到多人同时开发。
7、各层命名规约:
1)Service/DAO层方法命名规约如下。
获取单个对象的方法用get作为前缀。
获取多个对象的方法用list作为前缀,复数结尾,如listObjects。
获取统计值的方法用count作为前缀。
插入的方法用save/insert作为前缀。
删除的方法用remove/delete作为前缀。
修改的方法用update作为前缀。
2)领域模型命名规约如下。
数据对象:xxxDO,xxx为数据表名。
数据传输对象:xxxDTO,xxx为业务领域相关的名称
POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。
- 常量定义
1、不允许任何魔法值(即未经预先定义的常量),直接出现在代码中。
反例:String key=“Id#taobao_”+tradeId;
- OOP规约
1、避免通过一个类的对象引用访问此类的静态变量或静态方法,造成无谓增加编译器解析成本,直接用类名来访问即可。
2、所有的覆写方法,必须加@Override注解。
正例:
@Override
public int addUser(User user) {
userMapper.insertUser(user);
int id = user.getId();
return id;
}
3、不能使用过时的类或方法。
反例:
- 集合处理
1、高度注意Map类集合K/V能不能存储null值的情况。
集合类 | Key | Value | Super | 说明 |
---|---|---|---|---|
Hashtable | 不允许为null | 不允许为null | Dictionary | 线程安全 |
ConcurrentHashMap | 不允许为null | 不允许为null | AbstractMap | 锁分段技术 |
TreeMap | 不允许为null | 允许为null | AbstractMap | 线程不安全 |
HashMap | 允许为null | 允许为null | AbstractMap | 线程不安全 |
反例:由于HashMap的干扰,很多人认为ConcurrentHashMap是可以置入null值的,而事实上,存储null值时会抛出NPE异常。
- 并发处理
1、SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtiles工具类。
说明:可以使用DateTimeFormatter代替SimpleDateFormat。(DateTimeFormatter是线程安全的)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
- 控制语句
1、在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放到最后,即使它什么代码也没有。
2、在表达异常的分支时,尽量少用if-else方式,这种方式可以改写成:
if (condition){
...
return obj;
}
//接着写else的业务逻辑层代码
说明:如果不得不使用if()...else if()...else....方式表达逻辑,请勿超过三层。
正例:超过三层的if-else逻辑判断代码可以使用卫语句,卫语句实例如下:
if(condition){
System.out.println();
return obj;
}
if(condition){
System.out.println();
return obj;
}
System.out.println();
说明:卫语句就是把复杂的条件表达式拆分成多个条件表达式,条件为真时立刻从该方法中返回给调用方。卫语句的好处是条件表达式之间互相独立,不会互扰。
- 注释规约
1. 类、类属性、类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不要使用// xxx 方式。
说明:在 IDE 编辑窗口中,Javadoc 方式会提示相关注释,生成 Javadoc 可以正确输出相应注释;在 IDE 中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
2、所有的类都必须添加创建者和创建日期。
/**实现用户操作类
* @author Lyd
* @date 2019/12/27 19:46
*/
3、与其“半吊子”英文来注释,不如用中文注释把问题说清楚。专有名词与关键字保持英文原文即可。
4、代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。