JAVA如何代码静态检查术语_Sonar代码静态检查规则-JAVA篇(二)

最近又搜罗整理了一些代码扫描规则,今天继续把这些扫描规则分享给老铁们,以后想学一些开发规则了,直接打开学一学就好了。不多说,直接上干货!

规则五、".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();...}

}

}

本期的分享就到这里了,谢谢品读,希望您能有所收获。如果您有不同意见或者建议,欢迎回复评论。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值