如何使用 if 语句在构造函数中声明最终字符串?
How to declare a final String inside a constructor with an if-statement?
我曾经在构造函数中声明最终字符串。现在我想插入一个 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);
}
你能解释一下这是怎么回事吗?我应该读些什么才能得到这个。
事情是:
public Config(){
final String path = "<path>";
doSomething(path);
}
没有任何意义。 doSomething()
可以 而不是 改变您传递给它的 String 对象。
你这样使用 final 的整个想法是有缺陷的。 String 对象是不可变的,并且该方法接收对此类 String 对象的引用。所以即使你有
void doSomething(String whatever) {
whatever = "in your face";
...
}
你的 path
参考在那个电话之后仍然是一样的。
从这个角度来看,在您的第一个示例中,您可以(为了便于阅读)使用 doSomething("<path>");
除此之外,真正的答案是:您似乎对 final 关键字的正确用法有误解。像在您的示例中那样,在之后仅使用一次时声明变量 final 是没有意义的。拥有一个局部变量 final 只能防止该变量在其范围内 被重新分配。您只 读取 变量一次,因此使用 final 不会为您的代码添加任何有用的东西。
Can you explain me what is going on here,
代码段 2:path
在 if
语句的范围内声明。在 if
.
之外无法访问
代码段 3:path
在构造函数的范围内声明。它可以在该构造函数中访问。
what should I read about to get this.
JLS,当然是:https://docs.oracle.com/javase/specs/jls/se12/html/jls-6.html#jls-6.3比较复杂,找到合适的部分,仔细阅读,然后
doSomething("1".equals(mode) ? "<path1>" : "<path2>");
任何最终变量的范围都在其代码块内。在这个街区之外是不可见的。请参阅此线程以了解为什么以这种方式定义 final 的范围:
Scope of final local variable in java
我曾经在构造函数中声明最终字符串。现在我想插入一个 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);
}
你能解释一下这是怎么回事吗?我应该读些什么才能得到这个。
事情是:
public Config(){
final String path = "<path>";
doSomething(path);
}
没有任何意义。 doSomething()
可以 而不是 改变您传递给它的 String 对象。
你这样使用 final 的整个想法是有缺陷的。 String 对象是不可变的,并且该方法接收对此类 String 对象的引用。所以即使你有
void doSomething(String whatever) {
whatever = "in your face";
...
}
你的 path
参考在那个电话之后仍然是一样的。
从这个角度来看,在您的第一个示例中,您可以(为了便于阅读)使用 doSomething("<path>");
除此之外,真正的答案是:您似乎对 final 关键字的正确用法有误解。像在您的示例中那样,在之后仅使用一次时声明变量 final 是没有意义的。拥有一个局部变量 final 只能防止该变量在其范围内 被重新分配。您只 读取 变量一次,因此使用 final 不会为您的代码添加任何有用的东西。
Can you explain me what is going on here,
代码段 2:path
在 if
语句的范围内声明。在 if
.
代码段 3:path
在构造函数的范围内声明。它可以在该构造函数中访问。
what should I read about to get this.
JLS,当然是:https://docs.oracle.com/javase/specs/jls/se12/html/jls-6.html#jls-6.3比较复杂,找到合适的部分,仔细阅读,然后
doSomething("1".equals(mode) ? "<path1>" : "<path2>");
任何最终变量的范围都在其代码块内。在这个街区之外是不可见的。请参阅此线程以了解为什么以这种方式定义 final 的范围: Scope of final local variable in java