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

How to avoid premature initialization if the variable is only used inside of a scope

看来避免过早初始化是一个很好的编程习惯。

我正在使用 Eclipse 的 PMD 插件,并且我有一些 "Found 'DD'-anomaly for variable 'var'"。我知道这个异常意味着什么。这意味着一个变量被过早地初始化(初始化值从未被使用)。

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

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

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 块内),但它也是 return。因此,如果我在 if 块或 else 块内声明它以避免过早初始化,那么变量将不存在于这些块之外,我将无法 return它。

我也想避免使用多个 return 语句,因为那会导致 PMD 的另一个异常。

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

为此使用单个 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 变量中,以避免在代码中直接使用文字字符串。

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

final String var;

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

return var;

对于 class 字段上的过早初始化问题“避免使用冗余字段初始化器”,删除字段初始化。 字符串令牌=空; 字符串标记; (退出初始化)