在Java Project Valhalla的上下文中,我如何通常使用其默认值初始化value type?
最初,我认为将null
分配给任何值类型都会执行此初始化。但是,this question的答案和评论清楚地表明null
是引用,因此它与值类型无关(正是由于值类型是不是引用,而是直接值)。
E.g。如果我的Person
值类型包含StringValueType name
和DateValueType dateOfBirth
属性(此处dateOfBirth
将是包含int year
,int month
的嵌套值类型, int day
属性),如何以通用方式初始化我的Person
值类型,以便""
的属性值为name
(0, 0, 0)
分别为dateOfBirth
(或相应的默认值)?
为了更清楚,如果这是C,我会这样做:
memset(myPersonStructVariable, 0, sizeof(Person));
或者在现代C:
struct Person myPersonStructVariable = {0};
答案 0 :(得分:6)
aconst_null
字节码的等效值类型(即null
,它是参考类型的默认值),是vdefault
字节码。从最小值类型规范:
<强>操作强>
推送直接值类类型的默认值
<强>格式强>
vdefault indexbyte1 indexbyte2
...
<强>描述强>
unsigned indexbyte1和indexbyte2用于构造索引 进入当前类的运行时常量池(2.6),其中 索引的值是(indexbyte1&lt;&lt; 8)| indexbyte2。运行时 该索引处的常量池项必须是对a的符号引用 直接价值类型(4.4.1)。类型已解决(5.4.3.1)。
如果该类尚未初始化,则初始化(5.5) 已初始化。直接值类的默认值(2.3.5) type被压入操作数堆栈。
和2.3.5:
2.3.5 Direct Value Class Types
...
直接值类类型的默认值是类实例 其字段存储各自类型的默认值。那里 不是直接值类类型的特殊空值。
来自this presentation的引述说:
[默认值],它实际上是正确宽度的值,内部全部为0。
所以这与您使用memset(myStructVar, 0, size)
在C中所做的类似。
目前没有对值类型的语言支持,所以我们不能说是否会有类似null
文字的东西会返回值类型的默认值(例如MyValueType x = default(MyValueType)
或者其他东西像那样),但字节码存在。该演示文稿还显示了如何使用方法句柄来调用vdefault
。或者,您必须旋转字节码。
将字段初始化为用户定义的值(例如""
的{{1}})可能只是通过调用构造函数(或等价的值类型)来实现。但目前还不清楚,所以我们只能推测。
另外,请在此处查看valhalla vm原型的最新草稿:http://mail.openjdk.java.net/pipermail/valhalla-dev/2017-December/003631.html