コンピューティングにおいて、Project ValhallaはJava 10以降向けの主要な新言語機能を開発するための実験的なOpenJDKプロジェクトです。このプロジェクトは2014年7月に発表され、エンジニアのBrian Goetzが率いるOracleによる実験的な取り組みです。[ 1 ]
プロジェクトページ[ 2 ]には概要と技術ドラフトや早期アクセスビルドへのリンクが掲載されています。
Valhalla は、これらの分野で Java 言語の機能と強化を育成しています: [ 3 ] [ 2 ]
?またはを使用して、 !nullが許可されるかどうかを指定します。List<int>。これらの機能を実現するには、構文とVMレベルの両方の変更が必要になります。
このプロジェクトは、複数のJEP(JDK拡張提案)に分かれています。
値クラスは、既存のすべてのJavaクラスと同様に参照型です。ただし、同一性を持つ機能は放棄されています。つまり、演算子は値クラスのインスタンスを同一性ではなく、構成要素の等価性に基づいて比較します。さらに、値クラスのインスタンスに対する同期は失敗します。==
値クラスは参照型であるため、引き続きサポートされます。Java仮想マシンは、値クラスの追加の制約を利用して、ほとんどの場合、値型のヒープ割り当てをなくすことが期待されます。ただし、値クラスのインスタンスをフィールドに格納したり、インターフェースにアップキャストしたりする場合には、依然として割り当てが必要になります。null
Java API に存在する型(例: )は値ベースのクラスとして知られており、将来の JDK リリースで値クラスに変更される候補となっています。java.util.Optional
プリミティブクラスは値クラスのすべての制約を受けますが、参照型ではありません。つまり、をサポートする機能が失われます。代わりに、デフォルト値は各コンポーネント型(数値型の場合は、ブール型の場合は、参照型の場合は、ネストされたプリミティブクラスの場合はゼロ値)のゼロ値になります。null0falsenull
すべてのプリミティブクラスは「インライン」で格納されます。つまり、ヒープ割り当ては不要です。プリミティブクラスの配列は、配列からヒープへのポインタの間接参照を必要としません。必要に応じて、プリミティブクラスを値クラスに変換したり、その逆を行ったりするための変換が挿入されます。
import java.util.ArrayList ; import java.util.List ;// List<Integer> の代わりに List<int> を使用しますList < int > intList = new ArrayList <> ();intList.add ( 10 ) ; intList.add ( 20 ) ;System.out.printf ( "Integer List: %s % n " , intList ) ;// List<double> の代わりに List<Double> を使用しますList < double > doubleList = new ArrayList <> (); doubleList . add ( 3.14 ); doubleList . add ( 2.718 );System.out.printf ( " Double List: %s% n " , doubleList ) ;この JEP は、Java 仮想マシンの古典的なプリミティブ型 ( byte、char、short、int、long、boolean、 )floatをdoubleプリミティブクラスとして表現することを目的としています。
従来、8つの基本型は他のすべての型とは別に扱われてきました。これらの基本型から基本クラス宣言を提供することで、こうした特殊な扱いが大幅に削減され、より洗練された、理解しやすい型システムが実現します。
メモリへのアクセス性能と「ボックス化された」値へのアクセス効率は、これらの機能によって対処すべき主要な領域です。「値型」機能と「汎用特殊化」(リストまたはコレクションに適用した場合)はメモリ使用量を削減しますが、より重要なのは、通常キャッシュミスを引き起こすポインタの間接参照を回避することです。[ 9 ] [ 10 ]
メモリ全体に散在するデータ値を指すオブジェクト参照のリストや配列の代わりに、Project Valhallaの機能強化により、リストや配列の値を間接参照なしで、連続したメモリブロックとして直線的に配置することが可能になります。
値型は「クラスのようにコードを書き、int のように動作する」と想定されています。[ 11 ]同期と継承は値型では除外されます。これらはもはやオブジェクトの同一性や関連するメモリ/ポインタのオーバーヘッドを必要としませんが、互換性のために「ボックス化された」形式をとることができます。[ 10 ]
プロジェクト・ヴァルハラのエンジニアであるブライアン・ゲッツは、値型の導入後にJavaに演算子オーバーロードを追加できると提案した。 [ 12 ]