最近又搜罗整理了一些代码扫描规则,今天继续把这些扫描规则分享给老铁们,以后想学一些开发规则了,直接打开学一学就好了。不多说,直接上干货!
规则五、".equals()" should not be used to test the values of "Atomic" classes
AtomicInteger类和Integer类继承自Number类,但是在使用上有所同。AtomicInteger类是为了支持单个变量的线程安全和无需锁定而设计的。因此,一个AtomicInteger对象的".equals()"方法比较只有在跟自己比较的时候才会返回true。所以,对于比较它们的值是否相等,就应当使用AtomicInteger对象的”.get()“方法,进行取值比较。
这条规则适用于所有的atomic类对象,类:AtomicInteger,AtomicLong和AtomicBoolean。不示例规范:AtomicInteger a = newAtomicInteger(1);AtomicInteger b = newAtomicInteger(1);System.out.println(a.equals(b));//false规范示例:AtomicInteger a = newAtomicInteger(1);AtomicInteger b = newAtomicInteger(1);System.out.println(a.get() == b.get());//true
规则六:"=+" should not be used instead of "+="
"=+" 与 "=+" 意义不同,不应使用“=+”代替“+=”。a =+ b;虽然正确但写法不合规,应写成 a = +b;不规范示例:Integer a = -5;Integer b = 4;System.out.println(a =+ b);// 4规范示例:Integer a = -5;Integer b = 4;System.out.println(a += b);// -1
规则七、"@NonNull" values should not be set to null
标记为@NotNull或@NonNull的字段、参数或返回值,如果将值设置为null,或未能在构造函数中给字段赋值,并且在使用之前不进行非null检查,可能会在运行时导致NullPointerException。因此,标注非空注解的字段在使用前要进行非空判断。不规范示例:@NotNullpublicString indirectMix() {
String mix = null;
returnmix;// return value is Nonnull, but null is returned.}规范示例:@NotNullpublicString getName(String name) {
if(null!= name){
returnname;}
return"xiaoxiao";}
规则八、"compareTo" should not be overloaded
“compareTo”方法不可以重载。在实现Comparable.compareTo方法时,参数的类型必须与Comparable声明中使用的类型匹配,否则会有异常。示例:static classWorker1 implementsComparable {
@Overridepublic intcompareTo(Worker1 worker1) {
return this.age.compareTo(worker1.getAge());}
}
static classMan extendsWorker1 {
public intcompareTo(Man man){//参数类型应为Worker1
return this.age.compareTo(man.getAge());}
}
public static voidmain(String[] args) {
Worker1 worker = newWorker1(12);Worker1 worker1 = newWorker1(14);System.out.println(worker.compareTo(worker1));// -1Man man = newMan(11);Man man1 = newMan(15);System.out.println(man.compareTo(man1));// 异常}
规则九、"getClass" should not be used for synchronization
getClass()方法不应用于非final类中的同步,如果子类继承了该方法,子类与父类或其他类不同的对象做同步,同一时间可能会有多个线程进入代码块,虽然使用了synchronized关键字,但是也无法做到同步。不规范示例:public classWahh {
public voiddoSomethingSynchronized(){
// 子类继承此方法时不能做到同步synchronized(this.getClass()) {
// ...}
}
}规范示例:public classWahh {
public voiddoSomethingSynchronized(){
synchronized(Wahh.class) {// ...}
}
}
规则十、"notifyAll" should be used
notify()和notifyAll()都会唤醒休眠线程,但notify()只会唤醒一个线程,而notifyAll()则会唤醒所有线程。因为notify()可能无法唤醒正确的线程,所以应该使用notifyAll()。不规范示例:public classMyThread extendsThread{
@Overridepublic voidrun(){
synchronized(this){
...notify();...}
}
}规范示例:public classMyThread extendsThread{
@Overridepublic voidrun(){
synchronized(this){
...notifyAll();...}
}
}
本期的分享就到这里了,谢谢品读,希望您能有所收获。如果您有不同意见或者建议,欢迎回复评论。