为什么Java变量不经常声明为“final”?与Swift中的let关键字比较[已关闭]

ikfrs5lh  于 2023-05-27  发布在  Java
关注(0)|答案(6)|浏览(146)

已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

6年前关闭。
Improve this question
在Swift中,如果变量在初始化后没有变化,建议使用let关键字声明变量。我看到很多变量声明为let
在java中,我认为关键字final可以达到同样的目的。但从我有限的经验来看,我只看到人们在极少数情况下将变量声明为final。PI
为什么Java变量不经常声明为final?我是不是漏掉了什么?

vlju58qv

vlju58qv1#

参见In Java, should I use “final” for parameters and locals even when I don't have to?
基本上,对于字段来说,它是有用的,并且还可以更改它们的并发属性。参见Java concurrency: is final field (initialized in constructor) thread-safe?
然而,对于局部变量和参数,final的值不太清楚。它具有一定的语义价值,但另一方面,它也可以是噪音来拥有

public void foo (final int x, final int y){
    try{
        final int z = x+y;
    }
    catch (final Exception z){
        final String message = "";
        throw new RuntimeException(message);
    }
}

相比

public void foo (int x, int y){
    try{
        int z = x+y;
    }
    catch ( Exception z){
        String message = "";
        throw new RuntimeException(message);
    }
}

如果你有短方法(通常你应该有),那么很明显变量没有被改变。
因此,一些开发人员更喜欢使用final,因为它的语义值,而另一些开发人员则不喜欢使用它,因为它的冗长。

wj8zmpe1

wj8zmpe12#

Java遵循传统的C思维风格,如果我们正在创建一些东西(原始类型或对象),默认情况下它是一个变量,你必须在Java中放入“final”,在C/C++中放入“const”,使其成为常量。与这些语言相比,Swift非常新,它的目标是安全的编程模式和简单性。如果你在Java中获得了更多的经验,你就会知道人们确实更经常地使用最终实践和最佳实践。我认为主要原因(正如您也提到的)是您对Java的接触有限。

dfuffjeb

dfuffjeb3#

为什么Java变量不经常声明为final?我是不是漏掉了什么?
你缺少的是“人性”。
简单地说,Java的语法使得不添加final更容易。一般来说,人们不这样做,因为不这样做更容易。
请注意,“变量在默认情况下不是最终的”设计决策来自Java的祖先。
当然,这并没有解决您隐含的问题,即Java程序员是否应该更经常地使用final。但这是一个观点问题,StackOverflow不鼓励基于观点的问答。
1.在适当的情况下。在变量显然需要可变的情况下使用final会适得其反。

kcwpcxri

kcwpcxri4#

正如described by Marko Topolnik here,当在Java中用final初始化一个变量时,“编译器确保你只能初始化它一次。”如果是像intdoubles这样的原始类型,它可以确保值不会改变。然而,对于Object(再次引用该答案),“final仅与引用本身有关,而与被引用对象的内容无关。”它不能保证被引用对象内部的值保持不变。
例如,我可以用final定义一个List,如下所示:

final List<String> foo = new ArrayList<String>();

上面的Listfoo不能重新初始化,但其内容可以更改,即它不会使foo不可变。因此,这使得final关键字不那么有用。
final关键字在声明常量值时有其位置,特别是在使用static关键字的类中只需要一个示例时。下面是java.util.Random.Math中的一个例子:

public final class Math {

    public static final double PI = 3.14159265358979323846;
ndasle7k

ndasle7k5#

我认为这是因为在Java中没有这样的“传统”。
你看,我读的第一本关于Swift的书(苹果公司的Swift编程语言2.0)说,你创建的每个没有变异的变量都应该声明为let常量。
由于《Swift编程语言2.0》(The Swift Programming Language 2.0)是Swift的官方指南,几乎每个人都遵循它。即使人们不读那本书,他们也会读读读过那本书的人写的教程。因此,每个人的编码风格都是这样的。
相比之下,我读的第一本关于Java的书(Programming with Java for Dummies)并没有强调如果值不变,我们应该使用final。官方文件也很少这样做。所以只有少数程序员遵循这个规则。这导致大多数人编写的代码实际上遵循了这一规则。
此外,在Java中,你必须多写5个字符(单词“final”加上一个空格)来声明一个常量,而在Swift中,你不需要写任何额外的字符(var和let的字符数相同)!程序员是懒惰的,你知道的。

67up9zun

67up9zun6#

至少根据我的经验,如果变量在初始化后没有改变,建议使用final。对于原始类型,JVM会将其视为常量并进行一些优化。
在Java中,所有方法默认都是虚的,除非声明了final。它还将获得计算性能。

相关问题