我曾经在构造函数中声明一个最终的String。现在,我想插入一个if语句,以便在需要时对其进行不同的声明。
我曾经做过:
public Config(){
final String path = "<path>";
doSomething(path);
}
现在我正在尝试
public Config(String mode){
if (mode = "1") {
final String path = "<path1>";
} else {
final String path = "<path2>";
}
doSomething(path);
}
不幸的是,现在无法找到路径(找不到符号错误),我对研究的理解真的使我迷失了。 但是,以下作品,我只是无法解释...我必须对这里的事情有一个深刻的怀念概念。
public Config(String mode){
final String path;
if (mode = "1") {
path = "<path1>";
} else {
path = "<path2>";
}
doSomething(path);
}
您能解释一下这是怎么回事,我应该读什么才能得到这个。
答案 0 :(得分:10)
您能解释一下这是怎么回事吗,
代码段2:在path
语句范围内声明了if
。 if
之外的人无法访问。
代码段3:path
在构造函数的范围内声明。在该构造函数中可以访问它。
我应该读些什么来获得这个。
JLS,当然:https://docs.oracle.com/javase/specs/jls/se12/html/jls-6.html#jls-6.3相当复杂,找到合适的部分,仔细地阅读并使用
doSomething("1".equals(mode) ? "<path1>" : "<path2>");
答案 1 :(得分:3)
任何最终变量的范围都在其代码块内。在此块之外不可见。有关为何以这种方式定义final范围的信息,请参见以下线程: Scope of final local variable in java
答案 2 :(得分:1)
事情是:
public Config(){
final String path = "<path>";
doSomething(path);
}
没有任何意义。 doSomething()
仍然不能不能更改正在传递给它的String对象。
您那样使用final的整个想法简直是有缺陷的。字符串对象是不可变的,并且该方法接收对该字符串对象的引用。所以即使你有
void doSomething(String whatever) {
whatever = "in your face";
...
}
您的path
参考在该调用之后仍然相同。
从这个角度来看,在第一个示例中,(出于可读性考虑)您可以使用doSomething("<path>");
除此之外,这里的真正答案是:您似乎对final关键字的正确用法有误解。像在示例中一样,声明变量final仅在事后仅使用一次时没有意义。具有局部变量final只能防止在 范围内重新分配此变量。您只需一次读取变量,因此使用 final 不会为您的代码添加任何有用的内容。