scala中的val如何与java中的const不同?

Kub*_*han 6 java scala const

任何人都在关注scala中的val与java中的const有何不同?
有哪些技术差异?我相信我理解c ++和java中的"const"是什么.我觉得"val"在某种程度上是不同的和更好的,但我不能把手指放在它上面.谢谢

Dao*_*Wen 9

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方法成为最终的(即,您不能覆盖它们),而不是支持变量本身.


Chr*_*tin 0

Scalaval相当于finalJava 中的变量或字段。Scalavar相当于finalJava 中的非变量或字段。(顺便说一下,“var”和“const”都不是 Java 术语。)

Scala 的语法选择“更好”的一个方面valvar使用不可修改值的代码通常更容易理解。在 Java 中,final是“语法醋”,样式指南往往会争论代码是否应该使用它final来鼓励更好的编码,或者忽略它final以避免混乱。Scala 不存在这个难题,因为var和 的val长度完全相同,因此您可以更自由地选择最有意义的一个。