4

在 Java 的Project Valhalla的上下文中,我如何一般地初始化一个使用其默认值值类型?

最初,我认为分配null给任何值类型都会执行此初始化。但是,对这个问题的回答和评论清楚地表明,这null是一个引用,因此它与值类型无关(正是由于值类型不是引用,而是直接值)。

例如,如果我有一个Person带有StringValueType nameDateValueType dateOfBirth属性的值类型(这里dateOfBirth将是一个包含int year,int monthint day属性的嵌套值类型),我如何以通用方式Person初始化我的值类型,以便其属性的值是for和(或相应的默认值)值)为""name(0, 0, 0)dateOfBirth分别为?

为了更清楚,如果这是 C,我会这样做:

memset(myPersonStructVariable, 0, sizeof(Person));

或者在现代 C 中:

struct Person myPersonStructVariable = {0};
4

1 回答 1

6

与字节码等效的值类型aconst_null(即null,引用类型的默认值)是vdefault字节码。从最小值类型规范:

6.5vdefault

手术

推送一个直接值类类型的默认值

格式

vdefault indexbyte1 indexbyte2

...

描述

无符号 indexbyte1 和 indexbyte2 用于在当前类 (2.6) 的运行时常量池中构造一个索引,其中索引的值为 (indexbyte1 << 8) | 索引字节2。该索引处的运行时常量池项必须是对直接值类类型 (4.4.1) 的符号引用。类型已解析 (5.4.3.1)。

如果该类尚未初始化,则该类被初始化(5.5)。直接值类类型的默认值 (2.3.5) 被压入操作数堆栈。

和 2.3.5:

2.3.5 直接值类类型

...

直接值类类型的默认值是一个类实例,其字段存储了各自类型的默认值。直接值类类型没有特殊的空值。

该演示文稿中的一句话说:

[A default value] 真正是一个正确宽度的值,里面全是 0。

所以这类似于你在 C 中使用memset(myStructVar, 0, size).


目前没有对值类型的语言支持,所以我们不能说是否会有类似null文字的东西会返回值类型的默认值(例如MyValueType x = default(MyValueType)或类似的东西),但字节码是存在的。该演示文稿还展示了如何使用方法句柄来调用vdefault. 或者,您必须旋转字节码。

将字段初始化为用户定义的值(例如""for StrinValueType)可能只是通过调用构造函数(或等效的值类型)发生。但目前还不清楚,所以我们只能推测。


此外,请在此处查看 valhalla vm 原型的最新草案:http: //mail.openjdk.java.net/pipermail/valhalla-dev/2017-December/003631.html

于 2018-02-09T15:53:11.590 回答