有人愿意详细说明 scala 中的 val 与 java 中的 const 有何不同吗?
技术差异是什么?我相信我了解 C++ 和 Java 中的“const”是什么。我觉得“val”在某种程度上有所不同并且在某种意义上更好,但我就是不能 Handlebars 指放在上面。谢谢
最佳答案
const
in Java has no function —它是保留的,但实际上您不能将其用于任何用途。将 Java 变量声明为 final
是 roughly equivalent .
在 Scala 中将变量声明为 val
与 Java final
有类似的保证——但 Scala val
实际上是方法,除非它们是声明为 private[this]
。这是一个例子:
class Test(val x: Int, private[this] val y: Int) {
def z = y
}
这是编译后的类文件的样子:
$ 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);
}
所以从这个例子中可以清楚地看出 private[this] val
实际上是 Scala 中 Java 的 final
的等价物,因为它只是创建一个字段(没有 getter 方法)。然而,这是一个私有(private)领域,所以即使这样也不完全相同。
另一个有趣的事实:Scala 也有一个 final
关键字! Scala 的 final
的行为与 final
的工作方式类似对于 Java 中的类——即它可以防止覆盖。这是另一个例子:
final class Test(final val x: Int, final var y: Int) { }
以及生成的类:
$ 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);
}
请注意,final var
定义使 getter 和 setter 方法成为 final方法(即您不能覆盖它们),而不是支持变量本身。
关于java - scala 中的 val 与 java 中的 const 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417450/