sonar 代码质量检查问题分析(二)

半城伤御伤魂 提交于 2020-03-15 09:13:10

Mutable fields should not be "public static"

可变字段不应该是public static

不合规

public interface MyInterface {
  public static String [] strings; // Noncompliant
}

public class A {
  public static String [] strings1 = {"first","second"};  // Noncompliant
  public static String [] strings2 = {"first","second"};  // Noncompliant
  public static List<String> strings3 = new ArrayList<>();  // Noncompliant
  // ...
}

合规

private static final String [] COLUMN_NAMES = new String[]{"date","customerNumber","customerName",
        "account","emailAdress","mobilePhoneNumber","emailStatus"};

public static List<String> getColumnNames() {
    return Collections.unmodifiableList(Arrays.asList(COLUMN_NAMES));
}

问题分析

请注意,使可变字段(例如数组)为final将阻止重新分配变量,但这样做不会影响数组内部状态的可变性

可以改变的类型如果非常有必要声明为 ‘public static’ 可以通过上述 Collections.unmodifiableList 方式实现。

 

"public static" fields should be constant

  • public static 属性应是常量


合规代码

public class Greeter {
  public static Foo foo = new Foo();
  public static String realmOplate = "this is name";

  ...
}

不合规代码

public class Greeter {
  public static final Foo FOO = new Foo();
  ...
}
  private static String realmOplate = "this is name";
public static String getRealmOplate() {    
  return realmOplate;
}
public static void setRealmOplate(String realm) {   
  realmOplate = realm;
}

分析

在大多数情况下,public static 在多个对象之间共享状态的一种期望。但是使用这种方法,任何对象都可以在共享状态下做任何想做的事情,例如将其设置为null。

只有设置为了final时才会防止共享值被修改。

Class variable fields should not have public accessibility

  • 类中的成员属性不应该共有访问。


不合格代码

public class MyClass {

  public static final int SOME_CONSTANT = 0;     // Compliant - constants are not checked

  public String firstName;                       // Noncompliant

}

合规代码

public class MyClass {

  public static final int SOME_CONSTANT = 0;     // Compliant - constants are not checked

  private String firstName;                      // Compliant

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

}

问题分析

公共类变量字段不遵守封装原理,并且具有三个主要缺点:
无法添加其他行为,例如验证。
内部表示形式已公开,以后不能更改。
成员值可能会在代码中的任何位置发生更改,并且可能不符合程序员的假设。

通过使用私有属性和访问器方法(设置和获取),可以防止未经授权的修改。

Invoke method(s) only conditionally

 

不合规代码

logger.log(Level.DEBUG, "Something went wrong: " + message); 
// Noncompliant; string concatenation performed even when log level too high to show DEBUG messages

合规代码

logger.log(Level.DEBUG, "Something went wrong:{} ",message)

分析
日志在输出的情况下支持一个字符串输出,没有必要通过+生成多个字符串,浪费性能。

 

"toString()" and "clone()" methods should not return null

不合规代码

public String toString () {
  if (this.collection.isEmpty()) {
    return null; // Noncompliant
  } else {
    // ...
@Override
    public Object clone() {
        try {
            return (ContractQuery) super.clone();
        } catch (CloneNotSupportedException e) {
        }
        return null;
    }

合规

public String toString () {
  if (this.collection.isEmpty()) {
    return "";
  } else {
    // ...
     @Override
    public Object clone() throws CloneNotSupportedException {

        return (ContractQuery) super.clone();
    }

分析

当toString clone 返回Null时,容易产生空指针问题。

Modifiers should be declared in the correct order

Java 语言中修饰符的位置顺序。

1. Annotations

2. public

3. protected

4. private

5. abstract

6. static

7. final

8. transient

9. volatile

10. synchronized

11. native

12. strictfp

不合规代码

public final static String HOME= "home";

 

合规代码

public static final String HOME = "home";

分析

应根据约定俗称的规范进行编码,代码不仅仅是给机器用,但却是给人看的。写给机器的能用的不叫本事,写出人人都看的懂的才是能耐。

 

"@Deprecated" code should not be used

所以声明过期的方法,类都有与之对应的代替方式。

反射中常用的

//newInstance() 已过期
ContractDto contract = contractClass.newInstance();
//代替方式
contractClass.getDeclaredConstructor().newInstance()

Parentheses should be removed from a single lambda input parameter when its type is inferred

lambda 表达式中一个输入参数没有必要加括号

不合规代码

(x) -> x * 2

合规代码

x -> x * 2

总结

代码编程长路漫漫,吾将上下而求索。使用sonar改进代码,漂亮的代码令人向往,犹如一位漂亮精致的姑娘,让人目不转睛,爱不释手。

 

 

 

做个有追求的程序员还是有必要的。

头条号

微信号

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!