Valhalla 项目中的值类型是什么?
What are Value Types from Project Valhalla?
我已经开始阅读有关 Project Valhalla 的内容,但有些东西我真的不明白,那就是 Value Types
。
这是我的理解:
1)不能比较的对象是否可以作为参考?
final ValueType a = new ValueType();
final ValueType b = a;
System.out.println(a==b); returns false????
在Google AutoValue
code example中,它指出
if(o == this){return true;}//equals method implementation what is this? I am comparing references here right?
2) 根据维基百科,高效小'objects'无继承。 Small Objects?
和 Without inheritance
是什么意思?
使用 VT 是不可能的吗?
public final class ValueType extends Any //is this not possible??
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;}
如果是这样,JVM 是否会在方法调用之间不跟踪此 Objects or Values
而获得内存?
Project Valhalla
是 Java 初始项目的一部分,10 将在 2018 年左右准备就绪。
你最后的说法是正确的。 ValueType
变量在将它们作为参数传递给函数时被完全复制,而不是通常只是获取对对象的引用的副本。这允许您将一个小对象视为一个值类型,如 int 或 boolean。
1) 在 Valhalla 项目下,两个 ValueType 将直接通过字段进行比较,即使是 == 检查,也很像原始类型。对于 Google 的 AutoValue 类型,您永远不会直接使用 ==,因为那仍然是一种身份检查。
2) 小对象意味着这应该用于只有几个字段的对象,因为对象的全部内容将被重复复制。通过引用传递可以更好地服务于大对象。
没有继承意味着您将无法对值类型对象使用多态性。因为值类型意味着直接存储,就像原始值一样,它们不包含任何 class 信息,所以 JVM 必须始终能够从程序本身而不是从任何信息中推断出对象是什么在物体上。例如,整数字段可以是值类型成员,而数字字段仍必须是引用。
3) 它们用于避免访问对象成员通常所需的取消引用惩罚。例如,对于点列表,每个点实际上是对内存中 x 和 y 值的引用,因此遍历列表将涉及许多取消引用。如果点数直接存储在列表中,就可以避免这种情况。
4) 没有标识的对象意味着关于对象的所有重要内容都是它的值。正如一个值为 1 的 int 应该与所有其他值为 1 的 int 相同,所有字符串 "hello world" 都等于所有其他字符串 "hello world",无论它们是否实际上是同一个对象。相比之下,两个均为空的 ArrayList 具有相同的身份,因为它们是可变的,并且向一个列表添加元素必须与向另一个列表添加元素不同。
5) 在 Valhalla 项目下,如果 AutoValue 是一个值对象,它将是不可变的,因此不会调用 setName 方法。这类似于您永远无法将 1 变为 2 的方式,而是修改 1 所在的位置,以便 2 在那里。
其他答案都很好,但是关于 value 对象的核心点还有另一种观点:它们给你 stack 语义.
意思是:在 Valhalla 项目之前,你有 primitive "objects" 和
引用 个对象。第一个可以存在于栈中,但真正的对象只存在于堆中。
值对象将改变这一点。您可以拥有 "real" 个对象 - 但它们的数据 仅 驻留在堆栈中。这意味着你 not 有一个引用(因此取消引用的成本)任何东西 - 就像原始类型一样,value 被直接放置在堆栈上。但现在该值可以不仅仅是一个 int、long、... - 你可以有一个真实的 "complex" 对象 - 但它的所有数据都直接在堆栈上。
因此,您现在可以很好地执行 a == b
- 因为现在您不再比较指向堆的引用 - 但 a
和 b
直接拥有它们的相应的值。
更新 2019/2020,Build 14-valhalla+4-55 (2019/8/30)
内联 Class 是 "Value Type" 的新名称。根据当前项目状态,Inline Classes 不支持继承,但可以扩展接口。以下声明是合法的:
public inline class MyInlineClass extends SomeJavaInterface {}
他们确实有 equals
、hashcode
(和 toString
)方法。 “==”操作和 equals
(默认实现)对于简单情况是相同的,其中只涉及内联 Classes 和原始字段。但一般情况并非如此。
如果在 Inline Class 中添加一个经典的 Java 对象(包括 String 和 Array)作为字段,它会变得混乱。在这种情况下,“==”操作很可能不再按预期工作,您必须回退到经典自定义 equal
实现。
内联对象是不可变的并且不支持克隆(克隆没有意义)。
Inline Classes 的一个可能用例是复数或矩阵代数,这对于人工智能系统的神经网络算法至关重要。
我已经开始阅读有关 Project Valhalla 的内容,但有些东西我真的不明白,那就是 Value Types
。
这是我的理解:
1)不能比较的对象是否可以作为参考?
final ValueType a = new ValueType();
final ValueType b = a;
System.out.println(a==b); returns false????
在Google AutoValue
code example中,它指出
if(o == this){return true;}//equals method implementation what is this? I am comparing references here right?
2) 根据维基百科,高效小'objects'无继承。 Small Objects?
和 Without inheritance
是什么意思?
使用 VT 是不可能的吗?
public final class ValueType extends Any //is this not possible??
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;}
如果是这样,JVM 是否会在方法调用之间不跟踪此 Objects or Values
而获得内存?
Project Valhalla
是 Java 初始项目的一部分,10 将在 2018 年左右准备就绪。
你最后的说法是正确的。 ValueType
变量在将它们作为参数传递给函数时被完全复制,而不是通常只是获取对对象的引用的副本。这允许您将一个小对象视为一个值类型,如 int 或 boolean。
1) 在 Valhalla 项目下,两个 ValueType 将直接通过字段进行比较,即使是 == 检查,也很像原始类型。对于 Google 的 AutoValue 类型,您永远不会直接使用 ==,因为那仍然是一种身份检查。
2) 小对象意味着这应该用于只有几个字段的对象,因为对象的全部内容将被重复复制。通过引用传递可以更好地服务于大对象。
没有继承意味着您将无法对值类型对象使用多态性。因为值类型意味着直接存储,就像原始值一样,它们不包含任何 class 信息,所以 JVM 必须始终能够从程序本身而不是从任何信息中推断出对象是什么在物体上。例如,整数字段可以是值类型成员,而数字字段仍必须是引用。
3) 它们用于避免访问对象成员通常所需的取消引用惩罚。例如,对于点列表,每个点实际上是对内存中 x 和 y 值的引用,因此遍历列表将涉及许多取消引用。如果点数直接存储在列表中,就可以避免这种情况。
4) 没有标识的对象意味着关于对象的所有重要内容都是它的值。正如一个值为 1 的 int 应该与所有其他值为 1 的 int 相同,所有字符串 "hello world" 都等于所有其他字符串 "hello world",无论它们是否实际上是同一个对象。相比之下,两个均为空的 ArrayList 具有相同的身份,因为它们是可变的,并且向一个列表添加元素必须与向另一个列表添加元素不同。
5) 在 Valhalla 项目下,如果 AutoValue 是一个值对象,它将是不可变的,因此不会调用 setName 方法。这类似于您永远无法将 1 变为 2 的方式,而是修改 1 所在的位置,以便 2 在那里。
其他答案都很好,但是关于 value 对象的核心点还有另一种观点:它们给你 stack 语义.
意思是:在 Valhalla 项目之前,你有 primitive "objects" 和 引用 个对象。第一个可以存在于栈中,但真正的对象只存在于堆中。
值对象将改变这一点。您可以拥有 "real" 个对象 - 但它们的数据 仅 驻留在堆栈中。这意味着你 not 有一个引用(因此取消引用的成本)任何东西 - 就像原始类型一样,value 被直接放置在堆栈上。但现在该值可以不仅仅是一个 int、long、... - 你可以有一个真实的 "complex" 对象 - 但它的所有数据都直接在堆栈上。
因此,您现在可以很好地执行 a == b
- 因为现在您不再比较指向堆的引用 - 但 a
和 b
直接拥有它们的相应的值。
更新 2019/2020,Build 14-valhalla+4-55 (2019/8/30)
内联 Class 是 "Value Type" 的新名称。根据当前项目状态,Inline Classes 不支持继承,但可以扩展接口。以下声明是合法的:
public inline class MyInlineClass extends SomeJavaInterface {}
他们确实有 equals
、hashcode
(和 toString
)方法。 “==”操作和 equals
(默认实现)对于简单情况是相同的,其中只涉及内联 Classes 和原始字段。但一般情况并非如此。
如果在 Inline Class 中添加一个经典的 Java 对象(包括 String 和 Array)作为字段,它会变得混乱。在这种情况下,“==”操作很可能不再按预期工作,您必须回退到经典自定义 equal
实现。
内联对象是不可变的并且不支持克隆(克隆没有意义)。
Inline Classes 的一个可能用例是复数或矩阵代数,这对于人工智能系统的神经网络算法至关重要。