如果变量仅在作用域内使用,如何避免过早初始化

时间:2015-06-15 19:25:37

标签: java pmd

似乎避免过早初始化是一种很好的编程习惯。

我正在使用Eclipse的PMD附加组件,而且我已经找到了一些"发现了DD' -anomaly for variable'''' 。我知道这种异常意味着什么。这意味着变量过早初始化(从不使用初始值)。

但是,我遇到了以下问题。

这是我想要做的一般事例。

String var = null;

if (someCondition()) {
    Object a;
    //some treatment on a
    var = "some value" + a.toString();
}
else {
    Object b;
    //some treatment on b
    var = "some other value" + b.toString();
}

return var;

这就是我想要做的具体例子:

String token = null;
String authorization = getAuthorization(token);

if (authorization != null) {
    String[] parts = authorization.split(" ");
    if (parts.length == 2 && "Bearer".equals(part[0])) {
        token = parts[1];
    }
}
return token;

问题是变量只在范围内使用(在这种情况下在if块或else块内部),但它也是要返回的值。因此,如果我在if块或else块中声明它以避免过早初始化,那么变量不会存在于这些块之外,我无法返回它

我还想避免使用多个return语句,因为这会导致PMD出现另一个异常。

有没有办法在避免过早初始化的同时解决我的问题?

3 个答案:

答案 0 :(得分:1)

为此使用单个LoC:

return someCondition() ? "some value" : "some other value";

此处的代码:

String token;
String authorization = getAuthorization(token);

if (authorization != null) {
    String[] parts = authorization.split(" ");
    if (parts.length == 2 && "Bearer".equals(part[0])) {
        token = parts[1];
    }

return token;

在这种情况下,您应该使用默认值初始化变量,然后在需要的地方初始化它:

String token = "";
String authorization = getAuthorization(token);
if (authorization != null) {
    String[] parts = authorization.split(" ");
    if (parts.length == 2 && "Bearer".equals(part[0])) {
        token = parts[1];
    }
} //I assume there's a missing closing bracket here...
return token;

另外,我会将"Bearer"移到static final String变量中,以避免在代码中直接使用文字字符串。

答案 1 :(得分:0)

您可以简单地跳过初始化并保持变量未初始化。 JVM将使用null隐式初始化它。但是,只有在可以保证的情况下,这个变量才能最终在以下控制流中初始化。 您可以声明它final,表示它只会被分配一次。如果存在一个控制流,其中未分配变量,Eclipse编译器将指示错误。

final String var;

if (someCondition()) {
   var = "some value";
}
else {
   var = "some other value";
}

return var;

答案 2 :(得分:0)

对于“避免对类的字段使用过早的初始化”问题,请删除字段的初始化。 字符串标记= null; 字符串令牌; (退出初始化)