为什么Java变量更频繁地被声明为`final`?比较swift中的let关键字

时间:2016-07-01 07:46:22

标签: java swift variables final let

在swift中,如果变量在初始化后没有改变,建议使用let关键字声明变量。我看到许多变量声明为let

在java中,我认为关键字final可以起到同样的作用。但是根据我有限的经验,我只看到人们在极少数情况下将变量声明为final,例如PI。

为什么Java变量更频繁地声明为final?我有什么遗失的吗?

6 个答案:

答案 0 :(得分:5)

请参阅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?

但是,对于局部变量和参数,最终的值不太清楚。它有一些语义价值,但另一方面,它也可能是噪音

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作为其语义值,而其他人则因为其冗长而不愿使用它。

答案 1 :(得分:3)

Java遵循传统的C思维风格,如果我们创建某些东西(原始类型或对象),它默认是一个变量,你必须把put" final"在java和" const"在C / C ++中使它成为常数。与这些语言相比,Swift非常新颖,其目标是安全的编程模式和简单性。如果您获得了Java的进一步经验,您将会知道人们会更频繁地使用最终和最佳实践。我认为的主要原因(正如你所提到的)是你对Java的了解有限。

答案 2 :(得分:2)

在Java中使用final初始化变量允许编译器确保只能初始化一次。如果它是intdoubles等基本类型,则可以确保该值不会更改。但是,对于Objectfinal仅与引用本身有关,而与引用对象的内容无关。它不能保证被引用的对象内的值保持不变。

例如,我可以使用final定义List,如下所示:

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

上述List foo无法再次初始化,但其内容可以更改,即不会使foo不可变。因此,这会使final个关键字变得不那么有用。

final关键字在声明一个常量值时占有一席之地,尤其是在使用static关键字的类中只需要一个实例时。以下是java.util.Random.Math中的示例:

public final class Math {

    public static final double PI = 3.14159265358979323846;

答案 3 :(得分:2)

  

为什么Java变量更频繁地被声明为final?我有什么遗失的吗?

你缺少的是#34;人性&#34;。

简单地说,Java的语法使得更容易不添加final。一般来说,人们不会这样做,因为不容易这样做。

请注意,&#34;变量默认不是最终的&#34;设计决策来自Java的祖先。

当然,这并不能解决您的隐含问题,即Java程序员是否应更频繁地使用final 1 。但这是一个意见问题,StackOverflow不鼓励基于意见的Q&amp; A&#A>。

1 - ....在合适的情况下。使用final变量显然需要变量是适得其反的。

答案 4 :(得分:1)

我认为这是因为Java中没有这样的“传统”。

你看,我读到的第一本关于Swift的书(苹果公司的Swift编程语言2.0)说你创建的每个未变异的变量应该被声明为let常量。

由于Swift Programming Language 2.0(该书)是Swift的官方指南,几乎每个人都遵循它。即使人们不读这本书,他们也会阅读那些读过那本书的人写的教程。结果,每个人的编码风格都是这样的。

相比之下,我读到的第一本关于Java(用Java编写的傻瓜编程)的书并未强调如果值不会改变,我们应该使用final。官方文件也很少这样做。因此,只有少数程序员遵循该规则。这导致大多数代码实际遵循此规则。

此外,你必须再写5个字符(单词“final”加上一个空格)来在Java中声明一个常量,而在Swift中,你不要写任何额外的字符(var和let具有相同的数字)人物)!程序员很懒,你知道。

答案 5 :(得分:1)

至少根据我的经验,我被告知如果变量在启动后没有改变,建议使用final。对于原始类型,JVM会将其视为常量并进行一些优化。

在Java中,除非声明final,否则所有方法都默认为虚拟。它还将获得计算性能。