编程规约
-
命名
-
不能使用英语和拼音的混合命名,纯脆的拼音也不行
-
类名命名遵从驼峰形式,以大写字母开头;
-
参数名、方法名、成员变量名、局部变量名也遵从驼峰形式,以小写字母开头;
-
常量名全部大写,单词之间使用下划线分开,不用考虑单词太长,尽可能表达清楚意义;
-
抽象类使用Abstract或者Base开头,异常类使用Exception结尾,测试类使用要测试的类开头,Test结尾;
-
在Java中,数组命名与C++中不同,中括号是数组的一部分,例如:
String[] workers;
int gifts[6];
-
杜绝完全不规范的缩写,,避免望文不知意;
-
如果使用了设计模式,建议在类名中体现出设计模式,有利于阅读者快速理解;
-
枚举类名以Enum结尾,枚举成员全部大写,单词以下划线分割,
2. 常量定义
-
代码中不允许出现魔法值,即未经定义的常量;
-
long或者对应的包装类Long赋初始值时,数字结尾必须使用大写的L,小写l 误以为是1;
-
如果变量值仅在一个范围内变化,建议使用Enum类;
3. 格式规约
-
大括号使用规定,左括号前不换行,左括号后换行,右括号前换行,右括号后如果有else语句则不换行,否则换行;
-
左大括号和后一个字符中间无空格,右大括号和前一个字中间无空格;
-
if/for/while/switch/else等与之后的大括号中间都有一个空格;
-
任何运算符左右都有一个空格;
-
方法参数声明和传入时,多个参数逗号需要加一个空格;
4. OOP规约
-
所有的覆写方法都必须加@override注解,可以准确判断是否覆写成功;
-
Object的equals方法容易抛出空指针异常,应该使用常量或者确定有值的对象来调用equals方法;
-
所有的相同类型之间的包装类之间的值的比较使用equals方法,因为将-128到127之间的值赋值给一个Integer对象,会复用已有的对象,只有这个范围之外的对象才会在堆上创建,即使值相同,也不会是相同的对象;
-
当一个类有多个构造方法时,放在一起便于阅读;
-
类内方法定义顺序依次为public, protect, private, getter/setter,根据方法信息价值排序;
-
setter方法中,参数名称与类成员名称一致,this.param = param; 不要增加其他逻辑;
-
循环体内的字符拼接操作压抑使用StringBuilder的appdent方法扩展;
-
Object的clone方法默认使用浅拷贝,如果需要深拷贝需要重写;
5. 集合处理
-
重写equals方法必须重写hashCode方法,因为一些需求不能使用从Object类继承类来的equals方法,但是为了保证两个equals返回true得对象计算的hashCode必须相同的约定,就需要重写hshCode方法。为何重写equals方法就得重写hashCode方法
-
不要在foreach循环里继续元素的remove/add操作,如果需要remove元素使用Iterator;
6. 并发处理
-
线程资源必须通过线程池提供,避免创建和销毁线程的开销;
-
使用ThreadPoolExecutor创建线程池而不是Executor,后者创建线程的弊端有FixedThreadPool和SingleThreadPool的请求队列值为Integer.MAX_VALUE,可能会堆积大量请求到这OOM,CacheThreadPool和ScheduledThreadPool允许创建线程数量为Integer.MAX_VALUE,可能会创建大量线程导致OOM;
7.控制语句
-
在if/else/for/while/do语句中必须使用大括号,只有一条语句也需要;
-
不要在判断语句中执行复杂语句,将复杂逻辑判断的结果赋值给一个有意义的变量,这样可以提高可读性;
-
在循环体以内的语句需要多考虑性能,因为循环执行多次,每一条低效的语句对程序性能的影响叠加起来影响很大,定义变量,新建对象等;
8. 注释规范
-
类、成员变量和成员方法的注释如下,不能使用//作为注释
/** *注释 */
-
注释掉的代码尽可能配合说明,而不是简单注释掉,如果以后不会再用的代码,直接删除;