如何使用默认值一般初始化值类型?

时间:2018-02-09 15:44:28

标签: java initialization value-type project-valhalla

在Java Project Valhalla的上下文中,我如何通常使用其默认值初始化value type

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

E.g。如果我的Person值类型包含StringValueType nameDateValueType dateOfBirth属性(此处dateOfBirth将是包含int yearint month的嵌套值类型, int day属性),如何以通用方式初始化我的Person值类型,以便""的属性值为name (0, 0, 0)分别为dateOfBirth(或相应的默认值)?

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

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

或者在现代C:

struct Person myPersonStructVariable = {0};

1 个答案:

答案 0 :(得分:6)

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

  

6.5 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