瓦尔哈拉项目的价值类型是什么?

2022-09-01 09:57:51

我已经开始阅读有关瓦尔哈拉项目的文章,有些东西我真的不明白,那就是.Value Types

这是我的理解:

1)不能作为参考进行比较的对象吗?

final ValueType a = new ValueType();
final ValueType b = a;
System.out.println(a==b); returns false????

代码示例中,它声明Google AutoValue

if(o == this){return true;}//equals method implementation what is this? I am comparing references here right?

2)根据维基百科,没有继承的高效小“对象”。这是什么意思?Small Objects?Without inheritance

使用 VT 无法做到这一点吗?

public final class ValueType extends Any //is this not possible??

3)为什么使用它们?将使用哪种方案以及如何使用它。

4) 简而言之,值类型对象是没有恒等式的对象,即如果两个值对象各自的内部状态相等,则认为两个值对象相等。我的问题是:他们是否有状态,是否应该实现和。没有身份的对象是什么意思?Google AutoValue Libraryequalshashcode

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;}

如果是这样,JVM会不会在方法调用之间不跟踪这一点而获得内存?Objects or Values

Project Valhalla是Java 10的初始项目的一部分,将于2018年左右准备就绪。


答案 1

你的最终断言是正确的。当变量作为参数传递给函数时,变量是完全复制的,而不是通常只是获取对对象的引用的副本。这允许您将小对象视为值类型,如 int 或布尔值。ValueType


答案 2

1)在Valhalla项目下,两个Valhalla将直接通过字段进行比较,即使对于==检查也是如此,就像基元类型一样。使用Google的AutoValue类型,您永远不会直接使用==,因为这仍然是身份检查。

2)小对象意味着这应该用于只有几个字段的对象,因为对象的整个内容将被重复复制。大型对象最好通过引用传递。

如果没有继承,则意味着您将无法对值类型对象使用多态性。因为值类型是直接存储的,就像基元值一样,它们不包含任何类信息,所以JVM必须始终能够从程序本身而不是从对象上的任何信息中推断出对象是什么。例如,Integer 字段可以是“值类型”成员,而“数字”字段仍必须通过引用。

3) 它们用于避免访问对象成员通常需要的取消引用惩罚。例如,对于点列表,每个点实际上是对内存中 x 和 y 值的引用,因此迭代列表将涉及许多取消引用。如果积分直接存储在列表中,则可以避免这种情况。

4)没有身份的对象意味着关于对象的所有重要因素都是它的价值。就像一个 int 值 1 应该与所有其他值为 1 的 int 相同,并且所有字符串“hello world”都等于所有其他字符串“hello world”,无论它们是否实际上是同一个对象。相比之下,两个在当时都是空的 ArrayList 具有标识,因为它们是可变的,并且向一个列表添加元素必须与向另一个列表添加元素不同。

5)在Valhalla项目下,如果AutoValue是一个值对象,它将是不可变的,因此没有setName方法可以调用。这类似于你永远无法将1变异为2,而是修改1的位置,以便2在那里。

资料来源:http://cr.openjdk.java.net/~jrose/values/values-0.html


推荐