值声明语法
value 声明没有 identity 的不可变数据类型。它适合坐标、范围、标识符等“内容相同即相等”的数据。
norm
value Point {
Integer x
Integer y
}
Point origin = Point(x: 0, y: 0)静态规则
value 可以声明构造器和构造重载;未声明时使用字段构造。构造器中可以初始化当前对象的字段,不能修改其他 value,也不能把修改权限带入 Lambda。构造器的所有正常退出路径必须完成字段初始化。
norm
value Row<T> {
List<T> children
Integer spacing
Row(List<T> children) {
this.children = children
spacing = 0
}
Row(List<T> children, Integer spacing) {
this.children = children
this.spacing = spacing
}
}- 每个字段必须是非空类型,或显式声明为 nullable。
- 所有字段必须在构造结束前初始化。
- 构造后不能对字段原地赋值。
value不能继承 class,也不能被 class 继承;它可以实现 interface。- 相等与哈希由全部字段递归决定。
norm
origin.x = 1 // 编译错误:value 字段不可修改
origin = Point(x: 1, y: 0) // 合法:变量绑定到一个新值复制 value 时,语言保证结果彼此独立。编译器可以使用结构共享,只要程序无法观察到共享 identity。
与 Class 的边界
需要方法但不需要 identity 时仍可使用 value;需要对象身份和内部可变状态时使用 class。ref<T> 用于 value 存储位置,不用于 class 共享。