Подтвердить что ты не робот

Каковы типы стоимости проекта Valhalla?

Я начал читать о Project Valhalla, и есть что-то, чего я действительно не понимаю, и это 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 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 году или около того.

4b9b3361

Ответ 1

Ваше окончательное утверждение верно. Переменные ValueType полностью копируются при передаче их как параметра функции, а не как правило, просто получают копию ссылки на объект. Это позволяет обрабатывать небольшой объект, как если бы это был тип значения, такой как int или boolean.

Ответ 2

1) В проекте Valhalla два ValueTypes будут сравниваться по полям напрямую, даже для проверок ==, подобно примитивным типам. С помощью типов Google AutoValue вы никогда не будете использовать == напрямую, потому что это все равно будет проверка личности.

2) Малые объекты означают, что это должно использоваться для объектов, которые имеют только несколько полей, так как все содержимое объекта будет скопировано повторно. Большие объекты лучше обслуживать с помощью проходов по ссылке.

Без Inheritance означает, что вы не сможете использовать полиморфизм для объектов типа значения. Поскольку типы значений предназначены для непосредственного хранения, такие как примитивные значения, они не содержат никакой информации о классе, поэтому JVM всегда должна иметь возможность выводить то, что объект из самой программы, а не из любой информации об объекте. Например, поле Integer может быть членом типа значения, в то время как поле Number должно быть по-прежнему по ссылке.

3) Они используются, чтобы избежать штрафа разыменования, обычно требуемого для доступа к членам объекта. Например, со списком точек каждая точка на самом деле является ссылкой на значения x и y в памяти, поэтому повторение по списку будет связано со многими различиями. Если точки были сохранены непосредственно в списке, этого можно было бы избежать.

4) Объект без идентификатора означает, что все, что имеет значение для объекта, является его значением. Точно так же, как значение int value 1 должно быть таким же, как и все другие ints, оцененные 1, и все строки "hello world" равны всем остальным Strings "hello world", независимо от того, являются ли они фактически одним и тем же объектом. Напротив, два ArrayLists, которые являются пустыми, а в то время равными, имеют идентификатор, потому что они изменяемы, а добавление элемента в один список должно отличаться от добавления элемента в другой список.

5) В проекте Valhalla AutoValue, если это объект Value, будет неизменным, поэтому не будет метода setName для вызова. Это было бы похоже на то, как вы никогда не можете мутировать 1 на 2, вместо этого вы изменяете, где находится 1, так что вместо него есть 2.

Источник: http://cr.openjdk.java.net/~jrose/values/values-0.html

Ответ 3

Другие ответы носят прекрасный характер, но есть еще одна точка зрения на основную точку объектов значение: они дают вам семантику стека.

Значение: перед проектом Valhalla у вас либо есть примитивные "объекты", ссылочные объекты. Первые могут существовать в стеке, но реальные объекты живут только в куче.

Объекты Value изменят это. У вас могут быть "реальные" объекты, но их данные хранятся только в стеке. Это означает, что вы не имеете ссылку (и, следовательно, затраты на удаление ссылок), что угодно - так же, как и примитивные типы, значение непосредственно помещается в стек. Но теперь это значение может быть больше, чем просто один int, long,... - у вас может быть реальный "сложный" объект, но все его данные находятся прямо в стеке.

И из-за этого вы можете отлично сделать a == b сейчас - потому что теперь вы больше не сравниваете ссылки, указывающие на кучу, но a и b имеют соответствующие значения.