任何人都在关注scala中的val与java中的const有何不同?
有哪些技术差异?我相信我理解c ++和java中的"const"是什么.我觉得"val"在某种程度上是不同的和更好的,但我不能把手指放在它上面.谢谢
const
在Java中没有任何功能 - 保留,但实际上你无法使用它.声明一个Java变量final
是大致相当.
val
在Scala中声明变量与Java有类似的保证final
- 但Scala val
实际上是方法,除非它们被声明为private[this]
.这是一个例子:
class Test(val x: Int, private[this] val y: Int) {
def z = y
}
Run Code Online (Sandbox Code Playgroud)
这是编译的类文件的样子:
$ javap -p Test
Compiled from "Test.scala"
public class Test {
private final int x;
private final int y;
public int x();
public int z();
public Test(int, int);
}
Run Code Online (Sandbox Code Playgroud)
所以从这个例子可以清楚地看出,private[this] val
实际上Scala相当于Java final
,因为它只是创建了一个字段(没有getter方法).然而,它是一个私人领域,所以即便如此也是如此.
另一个有趣的事实:Scala也有一个final
关键字!Scala的final
行为类似于如何final
为工程类在Java中,即它可防止压倒一切的.这是另一个例子:
final class Test(final val x: Int, final var y: Int) { }
Run Code Online (Sandbox Code Playgroud)
由此产生的课程:
$ javap -p Test
Compiled from "Test.scala"
public final class Test {
private final int x;
private int y;
public final int x();
public final int y();
public final void y_$eq(int);
public Test(int, int);
}
Run Code Online (Sandbox Code Playgroud)
请注意,该final var
定义使得getter和setter方法成为最终的(即,您不能覆盖它们),而不是支持变量本身.
Scalaval
相当于final
Java 中的变量或字段。Scalavar
相当于final
Java 中的非变量或字段。(顺便说一下,“var”和“const”都不是 Java 术语。)
Scala 的语法选择“更好”的一个方面val
是var
使用不可修改值的代码通常更容易理解。在 Java 中,final
是“语法醋”,样式指南往往会争论代码是否应该使用它final
来鼓励更好的编码,或者忽略它final
以避免混乱。Scala 不存在这个难题,因为var
和 的val
长度完全相同,因此您可以更自由地选择最有意义的一个。