chi*_*tiz 29 java value-type project-valhalla
我开始阅读有关瓦尔哈拉项目的内容,而且有一些我真的不明白的事情就是这样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 main(final String[] args)
{
final Test clazz = new Test();
final AutoValue value = new AutoValue("Java Belongs to SUN");//Constructor Name
clazz.mutate(value);
System.out.println(value.getName()); //would print: Java Belongs to SUN??
}
private void mutate(final AutoValue value){value.setName("Java now is part of Oracle Corporation");return;}
Run Code Online (Sandbox Code Playgroud)
如果是这样,JVM会Objects or Values
在方法调用之间获得内存而不是跟踪它吗?
Project Valhalla
是Java 10的初始项目的一部分将在2018年左右准备好.
Kev*_*lia 18
你的最后断言是正确的.将这些ValueType
变量作为参数传递给函数时,完全复制这些变量,而不是通常只获取对象的引用副本.这允许您将小对象视为类似int或boolean的值类型.
Der*_*rce 15
1)在Project Valhalla下,两个ValueTypes将直接按字段进行比较,即使对于==检查,也很像基本类型.使用Google的AutoValue类型,您永远不会直接使用==,因为这仍然是身份检查.
2)小对象意味着它应该用于只有少数字段的对象,因为对象的整个内容将被重复复制.通过引用传递可以更好地服务大对象.
没有继承意味着您将无法对Value Type对象使用多态.因为值类型意味着直接存储,就像原始值一样,它们不包含任何类信息,因此JVM必须始终能够从程序本身而不是从对象上的任何信息推断出对象是什么.例如,Integer字段可以是Value Type成员,而Number字段必须仍然是引用.
3)它们用于避免访问对象成员通常所需的解除引用惩罚.例如,对于List of Points,每个Point实际上是对内存中x和y值的引用,因此迭代列表将涉及许多解引用.如果点直接存储在列表中,则可以避免这种情况.
4)没有身份的对象意味着对象的所有重要性都是它的价值.正如值1的int应该与值为1的所有其他int相同,并且所有字符串"hello world"等于所有其他字符串"hello world",无论它们是否实际上是同一个对象.相比之下,两个同时为空的ArrayLists都具有标识,因为它们是可变的,并且向一个列表添加元素必须与向另一个列表添加元素不同.
5)在Project Valhalla下,AutoValue(如果它是一个Value Object)将是不可变的,因此不会调用setName方法.它类似于你永远不会将1变为2,而是修改1所在的位置,以便改为2.
资料来源:http://cr.openjdk.java.net/~jrose/values/values-0.html