似乎避免过早初始化是一种很好的编程习惯。
我正在使用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出现另一个异常。
有没有办法在避免过早初始化的同时解决我的问题?
答案 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; 字符串令牌; (退出初始化)