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