命名规约
1. 代码中的命名不能以下划线和美元符号开头,也不能以这俩结束。
2. 代码中的命名不能出现用拼音和单词组合的形式。
3. 类名使用驼峰式命名规则,但领域模型的相关命名除外。 例:XmlService.java、UserDO.java
4. 代码中的方法名、参数名、成员变量、局部变量都用驼峰形式命名。 例:localValue/getHttpMessage()/inputUserId
5. 常量的命名都用大写,单词间用下划线隔开,力求语义清楚,见名知意,不要怕长。 例:MAX_STOCK_COUNT
6. 抽象类命名使用Abstract或者Base开头。
异常类命名使用Exception结尾。
测试类命名使用它所测试的类名开头,以Test结尾。
7. 数组类型的定义:String [] args,而不允许使用String args[]来命名。
8. POJO类(bean)中,布尔类型的变量,不要加is,否则部分框架解析会引起序列化错误。
例:基本数据类型为布尔型的变量,名称为isSuccess,它的方法也是isSuccess(),RPC框架反向解析时,因为“以为”对应的属性名称为Success,所以会导致获取不到属性,抛出异常。
9. 包名使用小写,点分隔符之间有且仅有一个自然语义的单词,包名使用单数形式,但类名如果有复数含义,类名可以使用复数形式。 例:工具类com.alibaba.open.util,类名是MessageUtils
10. 杜绝不规范的缩写。提高代码的可读性。 例:AbstractClass不可以缩写为AbsClass
11. 如果使用到了设计模式,建议在类名中体现出具体模式。 例:public class OrderFactory;
12. 接口中的类和属性不要加任何修饰符号(public也不要加),保持代码的简洁性,并加上有效的javadoc注释。
尽量不要在接口中定义变量,如果一定要定义变量,肯定是与接口方法有关,并且是整个应用的基础常量。
13. 接口和实现类
对于Service和DAO类,基于SOA的理念,暴露出来的一定是接口,内部的实现类用Impl的后缀与接口区别。
14. 枚举类名建议戴上Enum的后缀。
枚举成员的名称全部用大写,单词间用下划线隔开。 枚举其实就是特殊的常量类,且构造方法被默认强制是私有。
15. 各层命名规约
Service和DAO层的方法命名规约:
获取单个对象的方法用get做前缀。
获取多个对象的方法用list做前缀。
获取统计值的方法用count做前缀。
插入的方法用save或者insert做前缀。
删除的方法用remove或者delete做前缀。
修改的方法用update做前缀。
领域模型的命名规约:
数据对象:xxxDO,xxx即为数据库表名。
数据传输对象:xxxDTO,xxx为业务领域相关的名称。
展示对象:xxxVO,xxx一般为网页名称。
POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。
常量定义
1. 不允许出现魔法值(在代码中直接出现的值,而只有在这个值记述的那部分代码中才能明确了解其含义)直接出现在代码中。
2. long或者Long初始赋值时,必须使用大写的L,因为小写的容易和数字1弄混淆,造成误解。
3. 不要使用一个常量类维护所有的常量。应该按照常量功能进行归类,分开维护。因为大而长的常量类查找不方便,不利于维护和理解。
4. 常量的复用层次:
跨应用共享常量:放置在二方库中,通常是client.jar中的constant目录下。
应用内共享常量:放置在一方库的modules中的constant目录下。
易懂变量也要统一定义成应用内共享常量。
例如两人分别定义了表示“是”的常量
A public static final String YES = "yes";
B public static final String YES = "y";
A.YES.equals(B.YES)的结果,预期是true,但实际返回是false,导致产生问题。
子工程内部共享常量:在当前子工程的constant目录下。
包内共享常量:在当前包下单独的constant目录下。
类内共享常量:直接在类内部private static final定义。
5. 如果变量值仅在一个范围内变化用Enum类。如果还带有名称之外的延伸属性,必须使用Enum类。
例如:下面的数字就是延伸信息,表示星期几
格式规约
1. 花括号
如果大括号内为空,则简洁的写成{}即可,不需要换行;
如果是非空代码块,则:
左大括号前不换行。
左大括号后换行。
右大括号前换行。
右大括号后还有else等代码则不换行;表示终止右大括号后必须换行。
2. 小括号
左括号和后一个字符之间不出现空格,同样,右括号和前一个字符之间也不出现空格。
3. if/for/while/switch/do等保留字与左右括号之间都必须加空格。
4. 任何运算符左右必须加一个空格。
5. 缩进采用4个空格,禁止使用Tab字符。
如果使用Tab,则必须要设置一个Tab为四个空格。
6. 单行字符数限制不超过120个,超出需要换行。换行需遵循的原则:
第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进;
运算符与下文一起换行;
方法调用的点符号与夏文一起换行;
多个参数超长时,逗号后进行换行;
不要在括号前换行。
7. 方法参数定义和传入时,多个参数逗号后边必须加空格。
8. 不要为了对齐,增加多余的空格。
例如: int a = 3;
long b = 4L;
9. 方法体内的执行语句组,变量的定义语句组,不同的业务逻辑或者不同的语义之间插入一个空行,最好在前面加上合适的注释。
OOP规约
1. 避免通过一个类的对象引用访问此类的静态变量或静态方法,增加编译器解析成本,直接用类名访问即可。
直接通过类名.变量名直接访问,而不需要new一个对象得到实例再访问。
2. 所有的覆写方法必须加@override注解。
3. 相同参数类型,相同业务含义,才可使用java的可变参数,避免使用Object。
可变参数必须放置在参数列表的最后。
4. 对外暴露的接口签名,原则上不允许修改方法签名,避免对接口调用产生影响,接口过时要加@Deprecated注解,并说明采用的新接口或者新服务是什么。
5. 不能使用过时的类或方法。
6. 用equals判断时,将常量或确定有值的放在前面,避免出现空指针异常。
7. 所有的相同类型的包装类对象之间的值的比较,全部使用equals方法比较。
8. 关于基本数据类型与包装数据类型的使用标准如下:
所有的POJO类属性必须使用包装数据类型。
RPC方法的返回值和参数必须使用包装数据类型。
所有的局部变量使用基本数据类型。
【八种基本数据类型的包装类】
byte ——Byte
short ——Short
int ——Integer
long-----Long
float-----Float
double----Double
char----Character
boolean---Boolean
9. 定义DO/DTO/VO等POJO类时,尽量不要设定任何属性默认值。
例:POJO类的gmtCreate默认值为new Date(),但是这个属性在数据提取时并没有置入具体值,在更新其他字段时,又附带更新了此字段,导致创建时间被修改为当前时间。
10.