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

scala中的val与java中的const有何不同?,java,scala,constants,Java,Scala,Constants,有人想详细说明scala中的val与java中的const有何不同吗? 技术上的区别是什么?我相信C++和java中的“const”是什么意思。我觉得“val”在某种意义上是不同的、更好的,但我就是不能把我的手指放在它上面。谢谢在Java中,Scalaval相当于final变量或字段。Scalavar相当于Java中的非final变量或字段。(顺便说一下,“var”和“const”都不是Java术语。) Scala使用val和var的语法选择“更好”的方面是,使用不可修改值的代码通常更容易理解。

有人想详细说明scala中的val与java中的const有何不同吗?

技术上的区别是什么?我相信C++和java中的“const”是什么意思。我觉得“val”在某种意义上是不同的、更好的,但我就是不能把我的手指放在它上面。谢谢

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

Scala使用
val
var
的语法选择“更好”的方面是,使用不可修改值的代码通常更容易理解。在Java中,
final
是“语法醋”,风格指南倾向于争论代码应该使用
final
来鼓励更好的编码,还是省略
final
来避免混乱。Scala没有这个难题,因为
var
val
的长度完全相同,所以您可以更自由地选择最有意义的一个。

-它是保留的,但实际上不能用于任何用途。将Java变量声明为
final
是错误的

在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方法)。然而,这是一个私人领域,所以即使是这也不完全相同

另一个有趣的事实: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(即,您不能重写它们),而不是backing变量本身。

“在Java中,final是“语法醋”,样式指南倾向于争论代码应该使用final来鼓励更好的编码,还是省略final来避免混乱。”你有这两种说法的引证吗?依我看,
final
只是“语法糖”,因为类型是语法糖。泛型类型可能更是如此,因为它们实际上在编译时被删除,而
final
说明符仍然存在,但我从未听过有人说泛型只是“语法糖”。我也从来没有听说过有人说你应该省略
final
,因为它太杂乱了!关于你评论的第一部分——你知道我写的是“醋”而不是“糖”?我没有什么特别要引用的,这只是多年来我在同事和网上看到的一场辩论。举个例子:不,我没注意到你写的是醋而不是糖——我的错。实际上我以前从未见过这个词。然而,我仍然不同意
final
是语法醋,因为该定义似乎暗示语言设计者故意做了一些尴尬的事情来阻止它(比如Scala中笨重的
asInstanceOf
)。关于在方法参数上省略
final
这一点对我来说很有意义,因为所有
final
都会让签名变得笨重。如果你编辑你的问题,特别提到方法(可能强调“醋”),那么我可以删除我的反对票。我不认为这需要刻意成为醋。这通常只是糟糕的设计(比如分号)。这肯定不仅仅是方法签名;它也使方法体更笨重。你的否决票是你自己的,我不需要解释。别忘了
val
/
var
还用于一般性地标记字段和局部变量/值,这样你就不必声明类型<在斯卡拉,代码> Valx x/Cux>在C++中更接近于代码> const AutoXx/Cuff>。