格式规约
1.boolean类型的变量不要以is开头
3.Long类型赋值时后面加L
Long a = 2L;
4.不要出现魔数,魔数用常量表示,常量每个单词大写,并用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
5.常量值在一定范围内,用枚举表示
6.一个方法的代码不要过长,该抽出来的抽出来
7.接口变量:public static final,接口方法:public abstract,大家都知道的,就没必要累赘。这些都是默认有的,不必自己再写一遍。
8.【推荐】如果是形容能力的接口名称,取对应的形容词为接口名(通常是–able 的形容词)。
正例:AbstractTranslator 实现 Translatable 接口。
9.【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。
10.常量:
11.代码风格,if () 两者之间有一个空格
12.【强制】在进行类型强制转换时,右括号与强制转换值之间不需要任何空格隔开。
正例:
long first = 1000000000000L;
int second = (int)first + 2;
13.不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。
14.转义字符也要注意,比如
String a[]=str.split("\.");
将字符串进行划分,因为正则表达式中的点(.
)是一个特殊字符,它表示任意字符(除了换行符)。为了表示字面上的点(.
),你需要用反斜杠(\
)进行转义,但在 Java 字符串中,反斜杠也是一个转义字符,因此你需要使用两个反斜杠(\\
)来表示一个字面上的反斜杠。
15.返回给前端的最后是一个对象,不要用基本类型,如果是空对象就返回集合的空list
面向对象规约
-
接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。
-
equals,JDK1.7之后推荐使用Objects.equals
-
浮点型比较
5.
6.【强制】序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
如果在原来的基础上新增了字段,没事,还可以复用之前旧的uid,如果修改了之前的字段的类型或者删除了某个字段,那么uid也需要变动
- 核心原则 :仅在不兼容变更时强制修改
serialVersionUID
,兼容变更可保留。 - 最佳实践 :显式管理版本号,结合变更类型和业务需求决定是否更新。频繁更新可能增加维护成本,但能减少潜在风险。
7.
8.Java的String.split(String regex)
方法默认调用split(regex, 0)
,其中limit=0
表示尽可能多地分割字符串,但同时会丢弃末尾的空字符串
通过显式设置limit
参数为负数 (如-1
),强制保留所有分割结果,包括末尾的空字符串
9.
private修饰的方法只在本类中使用,删了可能不会有影响,也在自己的控制范围内,但是如果是public的方法,随意删除,可以会出现很大的问题
10.subList的操作会影响到原来的集合内容,如
// 如果子集合往自身加元素会影响到原集合
//如果子集合,已经使用了,然后又对原集合添加元素,就会报错,因为此时再在原集合上加元素,子集合的值就会顺序错乱
补充
1.countDownLatch,相当于一个异步转同步的工具,多个线程异步执行,都要调用countDown方法,当所有异步线程都执行了countDown方法后,主线程才会执行await方法,进而才会走接下来的逻辑。
2.使用随机数函数时,不要使用 “* 100” 这种形式的,有一个方法nextLong(100)或者nextInt(100),效果是相同的。
3.try catch的时候,不要一下把所有的代码都扩进去,只try必要的代码。进入到catch一定要做处理,再不济也要抛个异常。
4.不要在finally中使用return
5.单元测试的粒度要足够小
6.controller层的入参要判空,sevice层的方法入参尽量要判空
工作中记录
1.给前端返回的结果一定要是对象
2.发布到线上的时候,看一下上一个发布的分支是那个,然后合并到它上面再发布,因为有可能不是发布的master分支