Was sind Wert-Typen von Projekt Valhalla?
Habe ich begann zu Lesen über Projekt Walhalla und es ist etwas, was ich wirklich nicht verstehen, und es ist die Value Types
.
Dies ist, was ich verstehen:
1) Sind Objekte, können nicht vergleichen Sie es als Referenz?
final ValueType a = new ValueType();
final ValueType b = a;
System.out.println(a==b); returns false????
In Google AutoValue
code-Beispiel, heißt es
if(o == this){return true;}//equals method implementation what is this? I am comparing references here right?
2) Laut Wikipedia hocheffiziente kleine 'Objekte' ohne Vererbung. Was tun Small Objects?
und Without inheritance
bedeuten?
Ist dieses nicht möglich, mit VT?
public final class ValueType extends Any //is this not possible??
3) Warum werden Sie verwendet? Welches Szenario verwendet werden würde, und wie sollte es verwendet werden.
4) Nach Google AutoValue Library
, in einer nussschale, einen Wert typisierte Objekt ist ein Objekt ohne Identität, d.h. zwei value-Objekte werden als gleich angesehen, wenn Ihre jeweiligen internen Zustand gleich ist. Meine Frage ist: haben Sie Zustand und sollte Sie implementieren equals
und hashcode
. Was bedeutet Objekt ohne Identität bedeuten?
5) Ist diese Aussage korrekt?
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;}
Wenn es so ist, würde JVM-gain-Speicher nicht durch die Verfolgung dieser Objects or Values
zwischen Methoden-Aufrufe?
Project Valhalla
ist Teil der ersten Projekt-Java-10 würde bereit sein, im Jahr 2018 oder so.
- Sie haben eine Menge Forschung, und fragte eine gute Frage. Das heißt, ich bin mir nicht sicher, einschließlich der, die als ein Teil der Frage ist eine gute Idee, da eine person, die diese Frage beantworten können wahrscheinlich nicht benötigen 🙂
- Klingt wie, was c# ruft ein 'struct'
- Das macht 5 Fragen statt 1, und viele von Ihnen sind unklar, zumindest für mich. Ich vermute, jede Frage Sie haben kann beantwortet werden durch das Lesen cr.openjdk.java.net/~jrose/values/values-0.html. Es hat zum Beispiel einen ganzen Abschnitt gewidmet, um use-cases, was ist Ihre Dritte Frage.
- Auch Google
AutoValue
Bibliothek hat nichts zu tun mit der bevorstehenden Werttypen in Java 10. Es ist nur ein code-Generierung von annotation-Prozessor, die Ihnen hilft, reduzieren die boilerplate gebraucht beim schreiben einen Wert der Klasse mit der aktuellen Java-version. - Ich denke, eine simple Antwort ist, zu sagen Wert-Typen sind unveränderlich Typen. Genau wie ein int hat keine setter, Sie würde nie mutieren einen Wert geben, erstellen Sie eine neue mit anderen Eigenschaften. Daher Identität (wie einen Zeiger/Referenz), ist nicht sinnvoll. Dies ist Häufig in die funktionale Programmierung. Sie gewinnen Einblick in die-durch das betrachten von Clojure, die standardmäßig nutzt Wert/unveränderliche Typen.
- es ist genau wie ein C/C++/C# struct oder eine namedtuple in Python oder eine case-Klasse in Scala. Es gibt subtile vorgeschlagen, die performance-Vorteile. Schwer zu beurteilen, ohne einen Prototyp zu benchmark.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Letzte Behauptung ist richtig. Die
ValueType
Variablen sind vollständig kopiert bei der übergabe als parameter an eine Funktion, sondern als in der Regel nur immer eine Kopie der Referenz auf ein Objekt. Dies ermöglicht die Behandlung von einem kleinen Objekt, als wäre es eine Wert-Typ wie int oder boolean.1) Unter der Projekt Valhalla, zwei ValueTypes würde verglichen werden, indem Sie die Felder direkt, auch für == prüft, ähnlich wie primitive Typen. Mit Google AutoWert-Typen, die Sie nie benutzen würde == direkt, denn das wäre immer noch eine Identität zu überprüfen.
2) Kleine Objekte bedeutet, dass dies sollte verwendet werden, für Objekte, die nur ein paar Felder, da der gesamte Inhalt des Objekts wird wiederholt kopiert werden. Große Objekte wären besser bedient mit Pässen von Referenz.
Ohne Vererbung bedeutet, dass Sie nicht in der Lage sein zu verwenden Polymorphismus für Value-Type-Objekte. Denn Value-Typen gemeint sind, werden direkt gespeichert, wie primitive Werte, Sie enthalten keine jede Klasse Informationen, damit die JVM muss immer in der Lage sein zu folgern, was das Objekt ist aus dem Programm selbst, anstatt von sich aus keine Informationen über das Objekt. Zum Beispiel ein Integer-Feld könnte ein Werttyp-Mitglied, während ein Zahl-Feld müsste noch durch Verweis.
3) Sie verwendet, um die Dereferenzierung Strafe, die normalerweise erforderlich für den Zugriff auf die Mitglieder eines Objekts. Zum Beispiel, mit einer Liste der Punkte, jeder Punkt ist eigentlich ein Verweis auf die x-und y-Werte im Speicher, so dass die Iteration über die Liste beinhaltet viele dereferenziert. Wenn die Punkte gespeichert wurden, direkt in die Liste, dies würde vermieden werden.
4) - Objekt Ohne Identität bedeutet, dass alle Angelegenheiten, die über das Objekt seinen Wert. Nur als int-Wert 1, sollte das gleiche wie alle anderen int-Werten mit den Werten 1, und alle Strings "Hallo Welt", sind gleich alle anderen Strings "Hallo Welt", ob oder nicht Sie sind tatsächlich das gleiche Objekt. Durch Kontrast, zwei ArrayLists, die sind beide leer, während in der Zeit gleich, Identität, denn Sie sind veränderlich, und das hinzufügen eines Elements zu einer Liste müssen eindeutig sein hinzufügen ein element der anderen Liste.
5) Unter der Projekt Valhalla, den AutoWert, wenn es ein Value-Objekt, wäre unveränderlich, so würde es keine setName-Methode zu nennen. Es wäre ähnlich, wie du kann nie mutieren 1 in 2, Sie stattdessen ändern, wo eine 1 ist so angeordnet, dass ein 2 ist es anstelle.
Quelle: http://cr.openjdk.java.net/~jrose/values/values-0.html
Die anderen Antworten sind gut, aber es gibt eine andere Sichtweise über den Kern Punkt der Wert Objekte: Sie geben Ihnen stack Semantik.
Bedeutung: vor dem Projekt Walhalla, haben Sie entweder primitive "Objekte" und
Referenz Objekte. Die ersten, die existieren können, die auf dem stack, sondern Reale Objekte, die nur live auf dem heap.
Wert-Objekte ändern. Können Sie "echte" Objekte - aber Ihre Daten nur befindet sich auf dem stack. Dies bedeutet, dass Sie nicht eine Referenz haben (und daher die Kosten für die de-Referenzierung) alles - nur wie primitive Typen, die Wert ist direkt auf dem Stapel abgelegt. Aber jetzt, wo der Wert mehr sein kann als nur eine einzelne int, long, ... - können Sie einen echten, "Komplexes" Objekt - aber alle seine Daten direkt dort auf dem Stapel.
Und weil das so ist, können Sie gut tun
a == b
jetzt - denn jetzt sind Sie nicht mehr vergleichen verweist, zeigen auf den heap, abera
undb
direkt Ihre entsprechenden Werte.