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
によると、一言で言えば、値型オブジェクトはIDのないオブジェクトです。つまり、2つの値オブジェクトは、それぞれの内部状態が等しい場合に等しいと見なされます。 私の質問は、状態があり、equals
とhashcode
を実装する必要があるかどうかです。 IDのないオブジェクトはどういう意味ですか?
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)Project Valhallaでは、プリミティブ型と同様に、==チェックの場合でも、2つのValueTypeがフィールドによって直接比較されます。 GoogleのAutoValueタイプでは、==を直接使用することはありません。これは、IDチェックであるためです。
2)小さいオブジェクトは、オブジェクトのコンテンツ全体が繰り返しコピーされるため、フィールドが少ないオブジェクトに使用する必要があることを意味します。大きなオブジェクトは、参照によるパスでより適切に提供されます。
継承がないと、値型オブジェクトにポリモーフィズムを使用できなくなります。値型はプリミティブ値のように直接格納されることを意図しているため、クラス情報は含まれません。したがって、JVMは、オブジェクトに関する情報からではなく、プログラム自体からオブジェクトが何であるかを常に推測できる必要があります。たとえば、整数フィールドは値型メンバーである可能性がありますが、数値フィールドは参照によるものである必要があります。
3)これらは、オブジェクトのメンバーにアクセスするために通常必要とされる逆参照ペナルティを回避するために使用されます。たとえば、ポイントのリストでは、各ポイントは実際にはメモリ内のx値とy値への参照であるため、リストを反復処理すると多くの逆参照が必要になります。ポイントがリストに直接保存されている場合、これは回避されます。
4)アイデンティティのないオブジェクトとは、オブジェクトに関して重要なのはその値だけであることを意味します。 int値1が他のすべてのint値1と同じである必要があるのと同様に、すべての文字列 "hello world"は、実際に同じオブジェクトであるかどうかに関係なく、他のすべての文字列 "helloworld"と同じです。対照的に、両方とも空であるが、同時に等しい2つのArrayListは、変更可能であるためIDを持ち、一方のリストに要素を追加することは、もう一方のリストに要素を追加することとは異なる必要があります。
5)Project Valhallaでは、AutoValueがValueオブジェクトの場合、不変であるため、呼び出すsetNameメソッドはありません。これは、1を2に変更できない方法と似ています。代わりに、1の場所を変更して、代わりに2が存在するようにします。
他の答えは問題ありませんが、値オブジェクトのコアポイントについてもう1つの視点があります:それらはスタックセマンティクスを提供します。
意味:プロジェクトValhallaの前に、primitive "objects"とreferenceのいずれかがあります)オブジェクト。最初のものはスタックに存在できますが、実際のオブジェクトはヒープ上にのみ存在します。
値オブジェクトはそれを変えます。 「実際の」オブジェクトを持つことができますが、それらのデータのみはスタックに存在します。これは、not何かを参照する(したがって、参照を解除するためのコストがかかる)ことを意味します-プリミティブ型と同じように、valueスタックに直接配置されます。しかし、その値は1つのint、long、...だけではなく、実際の「複雑な」オブジェクトを持つことができますが、そのすべてのデータはスタックに直接存在します。
そのため、ヒープを指す参照を比較しなくなったため、a == b
をうまく実行できますが、a
とb
は直接対応する値を持っています。