如何使用 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:pathif 语句的范围内声明。在 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