valhalla tarapaca proyecto espejo antofagasta java value-type project-valhalla

java - tarapaca - ¿Cuáles son los tipos de valor del proyecto Valhalla?



proyecto tarapaca (3)

Empecé a leer sobre el Proyecto Valhalla y hay algo que realmente no entiendo y son los Value Types .

Esto es lo que entiendo:

1) ¿Son los objetos que no se pueden comparar como referencia?

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

En el ejemplo del código de Google AutoValue , indica

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

2) Según Wikipedia, pequeños "objetos" altamente eficientes sin herencia . ¿Qué hacen los Small Objects? y Without inheritance significa?

¿No es esto posible usar VT?

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

3) ¿Por qué se usan? Qué escenario se usaría y cómo se usaría.

4) De acuerdo con Google AutoValue Library , en pocas palabras, un objeto de tipo de valor es un objeto sin identidad, es decir, dos objetos de valor se consideran iguales si su estado interno respectivo es igual. Mi pregunta es: ¿tienen estado y deberían implementar equals y hashcode ? ¿Qué significa objeto sin identidad ?

5) ¿Es correcta esta afirmación?

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

Si es así, ¿ganaría JVM la memoria al no rastrear estos Objects or Values entre las llamadas de métodos?

Project Valhalla es parte del proyecto inicial de Java 10 que estaría listo en 2018 aproximadamente.


1) Bajo el Proyecto Valhalla, dos ValueTypes serían comparados por campos directamente, incluso para cheques ==, al igual que los tipos primitivos. Con los tipos de AutoValue de Google, nunca usaría == directamente, porque aún sería una verificación de identidad.

2) Objetos pequeños significa que debe usarse para objetos que solo tienen unos pocos campos, ya que todo el contenido del objeto se copiará repetidamente. Los objetos grandes serían mejor servidos con pases por referencia.

Sin herencia significa que no podrá utilizar polimorfismo para objetos de tipo de valor. Debido a que los tipos de valor están diseñados para ser almacenados directamente, como los valores primitivos, no incluyen ninguna información de clase, por lo que la JVM siempre debe poder inferir de qué se trata el objeto del programa, en lugar de la información del objeto. Por ejemplo, un campo Entero podría ser un miembro de Tipo de valor, mientras que un campo Número aún tendría que ser por referencia.

3) Se utilizan para evitar la penalización por anulación de referencia normalmente requerida para acceder a los miembros de un objeto. Por ejemplo, con una lista de puntos, cada punto es en realidad una referencia a los valores x e y en la memoria, por lo que la iteración sobre la lista implicará muchas desreferencias. Si los puntos se almacenaran directamente en la lista, esto se evitaría.

4) Objeto sin identidad significa que todo lo que importa sobre el objeto es su valor. Del mismo modo que un int valorado 1 debe ser el mismo que todos los demás valores valorados 1, y todas las cadenas "hola mundo" son iguales a todas las demás cadenas "hola mundo", independientemente de que sean o no el mismo objeto. Por el contrario, dos ArrayLists que están vacías, mientras que en el mismo momento, tienen identidad, porque son mutables, y agregar un elemento a una lista debe ser distinto de agregar un elemento a la otra lista.

5) Bajo el Proyecto Valhalla, el Valor Automático, si es un Objeto de Valor, sería inmutable, por lo que no habría un método setName al que llamar. Sería similar a cómo nunca se puede mutar 1 en 2, sino que se debe modificar la ubicación de un 1 para que haya un 2 en su lugar.

Fuente: cr.openjdk.java.net/~jrose/values/values-0.html


Las otras respuestas están bien, pero hay otra perspectiva sobre el punto central de los objetos de valor : le dan una semántica de pila .

Significado: antes del proyecto Valhalla, o bien tiene "objetos" primitivos y objetos de referencia . Los primeros pueden existir en la pila, pero los objetos reales solo viven en el montón.

Los objetos de valor cambiarán eso. Puedes tener objetos "reales", pero sus datos solo residen en la pila. Esto significa que no tiene una referencia (y, por lo tanto, un costo para la eliminación de referencias), como los tipos primitivos, el valor se coloca directamente en la pila. Pero ahora ese valor puede ser más que un solo int, largo, ... puede tener un objeto real, "complejo", pero todos sus datos están directamente en la pila.

Y debido a eso, puedes hacer a == b ahora, porque ahora ya no estás comparando referencias que apunten al montón, pero a y b tienen directamente sus valores correspondientes.


Su afirmación final es correcta. Las variables ValueType se copian por completo al pasarlas como un parámetro a una función, en lugar de obtener una copia de la referencia a un objeto. Esto le permite tratar un objeto pequeño como si fuera un tipo de valor como int o boolean.