加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – val是如何不可变的?

发布时间:2020-12-16 09:51:33 所属栏目:安全 来源:网络整理
导读:我知道val不是final,除非明确声明,并且使用 javap确认 Scalac没有插入final到字节码. 因为编译器阻止我们编写任何试图改变它的代码,所以val是不可变的吗? 解决方法 最终和不变性是两个正交的概念: val意味着你不能通过在初始声明后为它赋予任何东西来改变(
我知道val不是final,除非明确声明,并且使用 javap确认 Scalac没有插入final到字节码.

因为编译器阻止我们编写任何试图改变它的代码,所以val是不可变的吗?

解决方法

最终和不变性是两个正交的概念:

val意味着你不能通过在初始声明后为它赋予任何东西来改变(变异)变量:

val x = 1
x = 2 // error: reassignment to val

在JVM字节码中,它是通过创建私有成员和getter来实现的,但不是setter:

class A {
  val x = 1
}

=>

// Java equivalent of a generated bytecode
public class A {
  private final int x;
  public int x() { return x; }
  ...
}

final意味着你不能在子类中覆盖你的val:

class A {
  final val x = 1
}

class B extends A { 
  override val x = 2
}

// error: overriding value x in class A of type Int(1);
//  value x cannot override final member

如果使用var而不是val,final将导致相同的错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读