强制:
- 不能以下划线美元字符开头和结尾 _name, n a m e , n a m e , n a m e name, name_, name name,name,name 都是不允许的。 jvm底层的一些代码是以这种方式命名的
例如:
内部类编译之后a$b
dbcp2中的变量全部都是_开头
- 起名不能用中文,英文和拼音混搭风也不允许 例如:getPingFenByName
- 类名使用大驼峰方式,帕斯卡命名法
- 命名要全大写单词用下划线分开,不要缩写,尽量表达准确意思。 MAX_STOCK_COUNT VS MAX_COUNT
- 类名的要分类:
抽象类: Abstract 或者 Base 开头
异常类:以Exception结尾
测试类:以Test 结尾
demo code :
abstract class BaseAttachment extends NewBasePO
-
POJO类中布尔变量,都不要加is. 否则部分框架会引起序列化错误
案例:
SpringMVC 如果model类里定义了boolean 属性,会导致前后台传值不一致
定义基本数据类型 Boolean isDeleted, RPC框架在反向解析时以为对应的属性名是deleted. -
包名统一使用小写。类有复数含义时可以定义为复数形式
-
如果模块、接口、类、方法使用了设计模式,在命名时要体现具体模式
如: OrderFactory. LoginProxy
-
尽量不要在接口中定义变量,如果一定要定义接口变量,则一定要与接口方法相关,且是整个应用的基础变量.接口中的方法和属性不要加任何修饰符,否则编译报错,在idea中如果添加修饰符会提示错误。
-
参考 各层命名规约:
-
获取单个对象用get做前缀
-
获取多个对象用list做前缀
-
获取统计值的方法用count做前缀
-
插入的方法用save/insert做前缀
-
删除的方法用remove/delete做前缀
-
修改的方法用update做前缀
-
-
领域模型命名规约:
-
数据对象 xxxDO xxx 指代表名
-
数据传输对象 xxxDTO xxx与业务相关的名字
-
展示对象 xxxVO xxx网页名称
-
POJO时DO/DTO/BO(业务对象)/VO的统称。禁止命名为xxxPOJO
-
-
常量定义:
-
不允许有任何未经定义的常量出现在代码中
-
long或者Long赋值时,要用大写的L
-
不要使用一个巨大的常量类来维护所有的常量,按业务分开维护
-
如果常量值尽在一个范围内变化,且带有名称之外的延申属性,定义为枚举类。
-
-
OOP规约:
-
不要用一个类的实例调用静态方法或属性,这样会增加编译器的解析成本
扩展:JVM类的加载顺序扩展:JVM类的加载顺序
1、装载:查找和导入Class文件
2、链接:其中解析步骤是可以选择的
(a)检查:检查载入的class文件数据的正确性
(b)准备:给类的静态变量分配存储空间
(c)解析:将符号引用转成直接引用
3、初始化:对静态变量,静态代码块执行初始化工作 -
所有的覆写方法必须加@Override注解
避免:getObject get0bject的问题出现
-
尽量不用可变参数。
在重视性能的情况下,使用可变参数机制要特别小心。可变参数方法的每次调用都会导致进行一次数组分配和初始化。另外如果客户端调用带有可变参数的方法时,没有传递参数进去,就会在运行时而不是编译时失败。
-
所有的相同类型的包装类对象之间的比较全部使用equals方法
-
关于基本数据类型与包装数据类型的使用标准如下
-
所有的POJO类属性必须使用包装数据类型
-
RPC方法的返回值和参数必须使用包装类型
-
所有的局部变量使用基本数类型
-
定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。
-
构造方法里禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法里
-
POJO类必须强制写toString方法。便于排查问题
-
split方法得到数组时,需做最后一个分隔符后有无内容的检查
-
在setter和getter方法中尽量不要有业务逻辑
-
-
集合:
-
Set 必须重写hashCode 和 equals方法
-
如果自定义对象作为HashMap的键则必须重写hasnCode 和 equals 方法
-
ArrayList 的 subList 不可强转成ArrayList
ArrayList的subList方法 返回的是一个SubList对象。
SubList是ArrayList的一个内部类,所以我们并不能写如下代码:ArrayList originalList = new ArrayList(10); ArrayList subList = originalList.subList(2, 5);
-
在subList使用时一定要注意,对原集合的修改,会导致ConcurrentModificationException.
因为在每个subList的调用方法中都会做集合修改的判断 checkForComodification
For example:public static void main(String[] args) { ArrayList all = new ArrayList(); all.add(1); all.add(2); all.add(3); all.add(4); all.add(5); List sub = all.subList(1, 4); for(Object item : sub) { sub.remove(item); } }```
-
集合转数组时要使用 T[] toArray(T[] array), 不要直接使用list.toArray()
例子:
ArrayList<String> list = new ArrayList<>(); list.add(1); list.add(2); String[] strArray = new String[list.size()]; strArray = list.toArray(strArray);
思考为什么不使用toArray?
-
使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,add/remove/clear.否则会抛出UnsupportedOperationException。
Arrays.asList() 放回的时Arrays的内部类ArrayList,其并未实现上述方法。
-
不要在foreach循环里进行元素的remove/add操作。remove元素时请使用Iterator, 如果并发操作需要对Iterator对象加锁
反例:List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add("3"); for(String item : list) { if("1".equals(item)) { list.remove(item); } }
分析 1. add方法 modCount++, 初始化后和size相等2. remove 方法会修改 modCount++3. 在初始化迭代器时 会 将modCount 赋值给 expectedModCount4. 调用next方法时则会检查 modCount !== expectedModCount ==> exception throw
-
-
HashMap初始化时指定集合初始化大小
-
遍历map时使用entitySet而不是keySet.减少遍历次数,提高性能
-
ArrayList order/unsort HashMap unorder/unsort TreeSet order/sort
-
java 1.7之后,实现Comparator需要考虑三个条件:
1) x,y 的比较结果和 y,x 的比较结果相反。
2) x>y,y>z,则 x>z。
3) x=y,则 x,z 比较结果和 y,z 比较结果相同public int compare(String t1, String t2) { if (v1 < v2) { return -1; } else if (v1 > v2) { return 1; } else { return 0; } }