如何在带有if语句的构造函数中声明最终的String?

时间:2019-05-03 08:04:29

标签: java if-statement constructor final

我曾经在构造函数中声明一个最终的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);
}

您能解释一下这是怎么回事,我应该读什么才能得到这个。

3 个答案:

答案 0 :(得分:10)

  

您能解释一下这是怎么回事吗,

代码段2:在path语句范围内声明了ifif之外的人无法访问。

代码段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仅在事后仅使用一次时没有意义。具有局部变量fi​​nal只能防止在 范围内重新分配此变量。您只需一次读取变量,因此使用 final 不会为您的代码添加任何有用的内容。