提供以下代码段:
public boolean singleLine = true;
if (singleLine) {
String logLines;
} else {
List<String> logLines;
}
如何执行上述操作并将logLines保留在if / else语句之外的范围内?
答案 0 :(得分:7)
你不能同时(1)将其保持在范围内,(2)保持静态输入。你必须选择其中一个。
要将变量保留在范围内,您可以声明它为Object
类型。这样您就可以分配任何您想要的类型。不幸的是,这会失去静态类型,这意味着您必须进行强制转换才能执行任何有意义的操作。
要保持变量的静态类型,请将它们保存在不同的范围内。
这两种方案都不适合你的情况。解决此问题的常用方法是构建一个公共接口,从后续代码的角度来“统一”几种类型对象的行为。您可以在不同的分支中为此接口分配不同的实现,然后在此之后获得统一的行为。
以下是我的意思的一个小例子:
private void processSingle(String str) {
... // String-specific code
}
private void processList(List<String> strList) {
... // List-specific code
}
// Common interface
interface Wrapper {
void process();
}
// Using the common interface later on
...
Wrapper w;
if (singleLine) {
final String singleLineVal = ...
w = new Wrapper {
public void process() {
processSingle(singleLineVal);
}
};
} else {
final List<String> lst = ...
w = new Wrapper {
public void process() {
processList(lst);
}
};
}
// Now we can use the unified code:
w.process();
答案 1 :(得分:2)
不要在if
语句中定义空变量引用。也就是说,不要使用条件流来创建空引用。在条件之外定义引用然后使用子句instantiate
,或者只删除该条款。