Java使用非final变量设置final变量

15

这可能是个愚蠢的问题,但我冒险问一下。

通常情况下,我需要创建一个final变量以在其他地方使用,该变量的值将根据某些条件设置。以下是我的典型做法:

String notFinalVersion = null;
if (someThing == 1) {
    notFinalVersion = "The value was 1.";
} else {
    notFinalVersion = "The value is not 1.";
}
final String finalVersion = notFinalVersion;

我随后可以在需要的地方使用变量finalVersion。但是,这种方法似乎有些不妥。是否有更好的方法来做到这一点?

编辑:通过“更好”,我指的是寻找一种定义最终变量的方法,而不需要创建额外变量。我知道创建额外变量是低效且不良的做法,我相信必须有一种方法可以在没有额外步骤的情况下完成需要完成的任务。

我收到了一个答案,我已经将其标记为已接受。正如我在评论中所述,我最初尝试了所提供的解决方案,但从Eclipse中收到了错误提示。我可能第一次输入时打错了,或者Eclipse出现了一些小问题。

我承认有很多做事情的方法,每个人认为最好的方式并不是其他人会考虑的。但是,所有在此包含的答案都清晰明了,并且解决了我的问题。


你有什么问题? - user1907906
“更好” - 更好在哪里?你将使用什么标准来评判一个答案? - D.W.
此外,将变量初始化为无意义的值是一种不良实践。编译器非常擅长找到您忘记设置有意义值的代码路径。如果您对其进行初始化,则编译器无法提供太多帮助。而且,人类并不擅长辨别您在初始化变量时没有意义的情况。(一个真正好的编译器/IDE会告诉您,您从未使用过第1行设置的值。) - Tom Blodget
我同意。这就是为什么我问了我的问题。 - VingInMedina
“有没有更好的方法来做这件事?”是的,可以创建一个方法。例如final String name = getName();。优点是,该方法(name)可以更清晰地表明值来自何处或该值的含义。您仍然可以使用@rgettman的版本,但不要忘记我的建议:D。 - Tom
谢谢您的建议! - VingInMedina
2个回答

26

你可以声明一个final变量而不立即赋值,只要在使用之前一定要赋值。不要一开始就将其赋值为null,否则它将已经被确定赋值了。像你已经使用if/else块那样来赋值,就没问题了。

final String finalVersion;
if (someThing == 1) {
    finalVersion = "The value was 1.";
} else {
    finalVersion = "The value is not 1.";
}

谢谢。现在,我发誓这就是发生的事情,我第一次尝试了完全相同的代码,Eclipse在else子句的赋值处给了我一个错误。但是我刚刚再次尝试,它却没有给我编译错误。所以,显然我第一次输入的时候并不正确。 - VingInMedina
3
有很大的可能性是Eclipse出了问题或者落后了。 Eclipse并不是很好。 - Chris Hayes

14

除了 @rgettman 的回答之外,对于这种情况,您可以使用 三目运算符

final String finalVersion = someThing == 1 ? "The value was 1." : "The value is not 1.";

在某些情况下,不建议使用三元运算符,因为它会使代码的可读性变差。此外,编译器可以根据需要将if语句优化为三元运算符(反之亦然)。 - Raul Luna
3
在这种情况下,这样做更易读更简洁:只需1行而不是6行。就性能而言,差别可以忽略不计,如果有的话... - M A
1
@RaulLuna,对于从两个值中选择一个赋值给变量,三元运算符比if语句更易读(更短,只有一个赋值,只有一个作用域)。任何不能立即理解这段代码的人都不懂Java;不要为了他们编写丑陋的代码而迎合他们。 - Alex Celeste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接