代码之家  ›  专栏  ›  技术社区  ›  Thor

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

  •  1
  • Thor  · 技术社区  · 9 年前

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

    在java中,我认为关键字 final 可以达到同样的目的。但从我有限的经验来看,我只看到人们将变量声明为 最终的 在极少数情况下,例如PI。

    为什么Java变量没有声明为 最终的 更频繁?我有什么遗漏吗?

    6 回复  |  直到 9 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    看见 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作为其语义值,而其他开发人员则不喜欢使用它,因为它冗长。

        2
  •  3
  •   Khurram Shehzad    9 年前

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

        3
  •  2
  •   Stephen C    9 年前

    为什么Java变量不经常声明为final?我有什么遗漏吗?

    你缺少的是“人性”。

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

    注意,“默认情况下变量不是最终的”设计决策来自Java的祖先。


    当然,这并没有解决您隐含的问题,即Java程序员是否 应该 使用 最终的 更频繁地 1.

    1-……在适当的情况下。使用 最终的 变量显然需要可变,这会适得其反。

        4
  •  2
  •   Wilson    9 年前

    用初始化变量 final 在Java中,allow编译器确保您只能初始化它一次。如果它是类似于 int doubles ,它可以确保该值不会更改。然而,对于 Object , 最终的 只与引用本身有关,而与引用对象的内容无关。它不能保证被引用对象内的值保持不变。

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

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

    以上内容 List foo 无法再次初始化,但其内容可以更改,即它不会 食品 不变的因此,该品牌 最终的 关键字不太有用。

    最终的 关键字在声明常量值时有其作用,特别是当需要在类中使用 static java.util.Random.Math :

    public final class Math {
    
        public static final double PI = 3.14159265358979323846;
    
        5
  •  1
  •   Sweeper    9 年前

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

    由于《Swift编程语言2.0》(本书)是Swift的官方指南,几乎每个人都遵循它。即使人们不读那本书,他们也会读那些读过那本书的人写的教程。因此,每个人的编码风格都是这样的。

    相反,我读的第一本关于Java的书(用Java为假人编程)并没有强调我们应该使用 final 如果值不会改变。官方文件很少这样做。所以只有少数程序员遵循这个规则。这导致大多数编写的代码实际上遵循了这一规则。

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

        6
  •  1
  •   Xiaojun Chen    9 年前

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

    其他情况下,如在Java中,除非声明,否则所有方法默认都是虚拟的 最终的 。它还将获得计算性能。

    推荐文章