已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。
6年前关闭。
Improve this question
在Swift中,如果变量在初始化后没有变化,建议使用let
关键字声明变量。我看到很多变量声明为let
。
在java中,我认为关键字final
可以达到同样的目的。但从我有限的经验来看,我只看到人们在极少数情况下将变量声明为final
。PI
为什么Java变量不经常声明为final
?我是不是漏掉了什么?
6条答案
按热度按时间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的值不太清楚。它具有一定的语义价值,但另一方面,它也可以是噪音来拥有
相比
如果你有短方法(通常你应该有),那么很明显变量没有被改变。
因此,一些开发人员更喜欢使用final,因为它的语义值,而另一些开发人员则不喜欢使用它,因为它的冗长。
wj8zmpe12#
Java遵循传统的C思维风格,如果我们正在创建一些东西(原始类型或对象),默认情况下它是一个变量,你必须在Java中放入“final”,在C/C++中放入“const”,使其成为常量。与这些语言相比,Swift非常新,它的目标是安全的编程模式和简单性。如果你在Java中获得了更多的经验,你就会知道人们确实更经常地使用最终实践和最佳实践。我认为主要原因(正如您也提到的)是您对Java的接触有限。
dfuffjeb3#
为什么Java变量不经常声明为final?我是不是漏掉了什么?
你缺少的是“人性”。
简单地说,Java的语法使得不添加
final
更容易。一般来说,人们不这样做,因为不这样做更容易。请注意,“变量在默认情况下不是最终的”设计决策来自Java的祖先。
当然,这并没有解决您隐含的问题,即Java程序员是否应该更经常地使用
final
。但这是一个观点问题,StackOverflow不鼓励基于观点的问答。1.在适当的情况下。在变量显然需要可变的情况下使用
final
会适得其反。kcwpcxri4#
正如described by Marko Topolnik here,当在Java中用
final
初始化一个变量时,“编译器确保你只能初始化它一次。”如果是像int
或doubles
这样的原始类型,它可以确保值不会改变。然而,对于Object
(再次引用该答案),“final
仅与引用本身有关,而与被引用对象的内容无关。”它不能保证被引用对象内部的值保持不变。例如,我可以用final定义一个List,如下所示:
上面的
List
foo
不能重新初始化,但其内容可以更改,即它不会使foo
不可变。因此,这使得final
关键字不那么有用。final
关键字在声明常量值时有其位置,特别是在使用static
关键字的类中只需要一个示例时。下面是java.util.Random.Math
中的一个例子: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的字符数相同)!程序员是懒惰的,你知道的。
67up9zun6#
至少根据我的经验,如果变量在初始化后没有改变,建议使用
final
。对于原始类型,JVM会将其视为常量并进行一些优化。在Java中,所有方法默认都是虚的,除非声明了
final
。它还将获得计算性能。