在Java的Valhalla项目中,如何通用地使用其默认值初始化值类型?
最初,我认为分配null
任何值类型都会执行此初始化。但是,此问题的答案和注释清楚地表明这null
是一个引用,因此它与值类型无关(正是由于值类型不是引用,而是直接值这一事实)。
例如,如果我有一个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};
aconst_null
字节码等效于字节码的值类型(即null
,这将是引用类型的默认值)vdefault
。根据最小值类型规范:
操作方式
推送直接值类类型的默认值
格式
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:
...
直接值类类型的默认值是一个类实例,其字段存储其各自类型的默认值。没有直接值类类型的特殊空值。
而从报价这个演讲说:
[默认值]实际上是正确宽度的值,其中全为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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句