在swift中,如果变量在初始化后没有改变,建议使用let
关键字声明变量。我看到许多变量声明为let
。
在java中,我认为关键字final
可以起到同样的作用。但是根据我有限的经验,我只看到人们在极少数情况下将变量声明为final
,例如PI。
为什么Java变量更频繁地声明为final
?我有什么遗失的吗?
答案 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
初始化变量允许编译器确保只能初始化一次。如果它是int
或doubles
等基本类型,则可以确保该值不会更改。但是,对于Object
,final
仅与引用本身有关,而与引用对象的内容无关。它不能保证被引用的对象内的值保持不变。
例如,我可以使用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
,否则所有方法都默认为虚拟。它还将获得计算性能。