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

标签 java scala constants

有人愿意详细说明 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/

相关文章:

java - 仅在窗口在 Java 中不再可见后才读取值

java - 如何使用 Spring 进行参数化依赖注入(inject)?

scala - 在 Spark 和 Scala 中创建数据集时出现问题

regex - Spark DataFrame `regexp_replace` 中的反向引用

c++ - 使用常量设置变量类型

constants - 如何发现最低的CGFloat负值?

java - spring bean id 值可以有 $ 吗?

java - 如何在 Android Studio 中创建自定义图像按钮?

使用 case 语法定义的 Scala PartialFunction 在 isDefinedAt 上始终返回 true

javascript - 将 String 文字提取为 Javascript 中的常量是最佳实践吗?