Каковы типы значений из проекта Valhalla?
Я начал читать о проекте 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 году или около того.
3 ответа
Ваше последнее утверждение верно. ValueType
Переменные полностью копируются при передаче их в качестве параметра функции, а не просто при получении копии ссылки на объект. Это позволяет вам обрабатывать небольшой объект, как если бы это был тип значения типа int или boolean.
1) В Project Valhalla два типа ValueTypes будут сравниваться по полям напрямую, даже для проверок ==, во многом как примитивные типы. С типами Google AutoValue вы никогда не будете использовать == напрямую, потому что это все равно будет проверка личности.
2) Маленькие объекты означают, что это следует использовать для объектов, которые имеют только несколько полей, так как все содержимое объекта будет копироваться повторно. Крупные объекты лучше обслуживать пропусками по ссылке.
Без наследования означает, что вы не сможете использовать полиморфизм для объектов типа значения. Поскольку типы значений предназначены для непосредственного хранения, подобно примитивным значениям, они не содержат никакой информации о классе, поэтому JVM всегда должна иметь возможность определять, что является объектом, из самой программы, а не из любой информации об объекте. Например, поле Integer может быть элементом типа значения, в то время как поле Number все равно должно быть ссылкой.
3) Они используются, чтобы избежать штрафа за разыменование, обычно требуемого для доступа к членам объекта. Например, в случае списка точек каждая точка фактически является ссылкой на значения x и y в памяти, поэтому итерация по списку потребует многих разыменований. Если бы Точки хранились непосредственно в списке, этого было бы избежать.
4) Объект без идентичности означает, что все, что имеет значение для объекта, - это его ценность. Точно так же, как целое число 1 должно быть таким же, как и все другие целые числа со значением 1, и все строки "привет мир" равны всем другим строкам "привет мир", независимо от того, являются ли они на самом деле одним и тем же объектом. Напротив, два ArrayList, которые оба пусты, хотя в то же время равны, имеют идентичность, потому что они изменчивы, и добавление элемента в один список должно отличаться от добавления элемента в другой список.
5) В Project Valhalla значение AutoValue, если оно является объектом Value, будет неизменным, поэтому не будет никакого метода setName для вызова. Это было бы похоже на то, как вы никогда не можете преобразовать 1 в 2, вместо этого вы изменяете местоположение 1, чтобы вместо него было 2.
Источник: http://cr.openjdk.java.net/~jrose/values/values-0.html
Другие ответы хороши, но есть еще одна точка зрения на основную точку объектов- значений: они дают вам семантику стека.
Значение: перед проектом Valhalla у вас либо есть примитивные "объекты", либо ссылочные объекты. Первые могут существовать в стеке, но реальные объекты живут только в куче.
Значимые объекты изменят это. Вы можете иметь "настоящие" объекты - но их данные находятся только в стеке. Это означает, что у вас нет ссылки (и, следовательно, стоимости разыменования) - как и примитивные типы, значение напрямую помещается в стек. Но теперь это значение может быть больше, чем просто int, long,... - у вас может быть настоящий, "сложный" объект - но все его данные находятся прямо в стеке.
И из-за этого, вы можете приятно сделать a == b
сейчас - потому что теперь вы больше не сравниваете ссылки, которые указывают на кучу - но a
а также b
непосредственно имеют свои соответствующие значения.
ОБНОВЛЕНИЕ 2019/2020, сборка 14-valhalla+4-55 (30.08.2019)
Встроенный класс - это новое имя "Типа значения". Согласно текущему состоянию проекта встроенные классы не поддерживают наследование, но могут расширять интерфейсы. Следующее заявление является законным:
public inline class MyInlineClass extends SomeJavaInterface {}
У них есть equals
, hashcode
(а также toString
) методы. "==" операция иequals
(реализация по умолчанию) такие же для простого случая, когда задействованы только встроенные классы и примитивные поля. Но в целом это не так.
Это становится беспорядочным, если вы добавляете классический объект Java (включая String и Array) в качестве поля внутри встроенного класса. В этом случае операция "==", скорее всего, больше не будет работать должным образом, и вам придется вернуться к классической настройке.equal
реализация.
Встроенные объекты неизменяемы и не поддерживают клонирование (клонирование не имеет смысла).
Возможным вариантом использования встроенных классов могут быть комплексные числа или матричная алгебра, что важно для алгоритмов нейронных сетей в системах искусственного интеллекта.