如果条件,避免文字

Wal*_*uch 6 java pmd sonarqube

这部分代码被声纳中的pmd拒绝:

public String getFoo() {
    String foo = System.getProperty("foo");

    if (foo == null) {
        foo = System.getenv("foo");
    } else if (foo == null) {
        foo = "defaultFoo";
    }

    return foo;
}
Run Code Online (Sandbox Code Playgroud)

它说"在条件下避免文字".有人能告诉我这个或这个规则试图产生什么问题吗?

lau*_*sas 6

你为什么不用:

public String getFoo() {
    String foo = System.getProperty("foo", "defaultFoo");

    return foo;
}
Run Code Online (Sandbox Code Playgroud)

"defaultFoo"如果没有找到属性,它将返回.

http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getProperty(java.lang.String,java.lang.String)


Kon*_*kov 4

Sonar 试图说的是,您应该避免null在条件中使用硬编码文字(例如 )if

假设以下示例:

假设我们有这样的if语句,Sonar 对此语句发出避免在 If Condition 中使用文字的警告:

if (i == 5) { 
    //do something
}
Run Code Online (Sandbox Code Playgroud)

通过将硬编码文字声明为final具有描述性名称的 ( ) 变量,可维护性得到增强:

final int FIVE = 5;
if (i == FIVE) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

声纳不再发出警告。

  • @kocko 这似乎是一件疯狂的事情,与 `final int FIVE = 5;` 一样,它除了“内部平台效应”之外什么也没有得到。将其编码为“final int TARGETVALUE= 5;”会更有用 (5认同)
  • 是的,就是这个原因。但在这种情况下,我想我会删除这条规则。 (3认同)
  • 这就是有些人讨厌静态代码分析工具的原因。我不。但它们确实需要配置和定制才能真正提供帮助。在这里,您可以将自己限制为幻数并使用 Checkstyle 的 MagicNumber 检查,或者从该检查中排除“null”和其他有用的文字。 (3认同)