我开始阅读有关瓦尔哈拉项目的内容,而且有一些我真的不明白的事情就是这样Value Types.
这就是我的理解:
1)对象是否无法将其作为参考进行比较?
final ValueType a = new ValueType();
final ValueType b = a;
System.out.println(a==b); returns false????
Run Code Online (Sandbox Code Playgroud)
在Google AutoValue 代码示例中,它说明了
if(o == this){return true;}//equals method implementation what is this? I am comparing references here right?
Run Code Online (Sandbox Code Playgroud)
2)根据维基百科,高效的小"对象"没有继承.做什么Small Objects?和Without inheritance意味着什么?
这是不可能使用VT?
public final class ValueType extends Any //is this not possible??
Run Code Online (Sandbox Code Playgroud)
3)为什么使用它们?将使用哪种方案以及如何使用它.
4)Google AutoValue Library简而言之,值类型对象是没有标识的对象,即如果它们各自的内部状态相等,则认为两个值对象相等.我的问题是:他们是否有州,他们应该实施equals和hashcode.什么是没有身份的对象是什么意思?
5)这个断言是否正确?
public static void …Run Code Online (Sandbox Code Playgroud) 通用专业化和值类型是未来JVM的预计特征; 链接到瓦尔哈拉项目页面在这里.
现在,根据我的理解,可以宣布:
final List<int> myList = new ArrayList<>(); // for instance
Run Code Online (Sandbox Code Playgroud)
但是接着List定义了另一个.remove()方法,除了在Collection接口中定义的方法之外,它接受int一个参数,它是要删除的列表中的索引; 这就是为什么,目前,list以下示例中的内容:
final List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.remove(2);
Run Code Online (Sandbox Code Playgroud)
将是[1, 2]和不[1, 3](选择最具体的过载).
但是,如果将来我们能够声明一个List<int>,我们就会遇到一个问题:该remove方法会选择多少重载?
声纳显示
使这个基于值的字段瞬态,因此它不包含在此类的序列化中.
这是一个面向未来的错误,当基于价值的类将被释放时.
那么,如果应用程序永远不依赖于它的对象标识,那么我可以使基于值的对象非瞬态吗?
在Java中,一直存在原始类型和引用,但不存在值类型。
Valhalla 项目的目标之一是探索和孵化候选功能,例如值类型。
我想知道是否null可以分配给值类型变量,或者值类型变量是否可以与null.
如果没有,我也想知道为什么。
在Java的Project 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));
Run Code Online (Sandbox Code Playgroud)
或者在现代C:
struct Person myPersonStructVariable = {0};
Run Code Online (Sandbox Code Playgroud)