クラスSwitchBootstraps
switch文の選択機能を実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。 ブートストラップは、switchのcaseラベルに対応する追加の静的引数を取り、暗黙的に[0..N)から番号付けします。 - 導入されたバージョン:
- 21
-
メソッドのサマリー
修飾子と型メソッド説明static CallSiteenumSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 列挙型のターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。static CallSitetypeSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 参照タイプのターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。クラスオブジェクトで宣言されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait修飾子と型メソッド説明protected Objectclone()このオブジェクトのコピーを作成して、返します。booleanこのオブジェクトと他のオブジェクトが等しいかどうかを示します。protected voidfinalize()削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。最終決定は非推奨であり、将来のリリースで削除される可能性があります。final Class<?> getClass()このObjectの実行時クラスを返します。inthashCode()このオブジェクトに対するハッシュ・コード値を返します。final voidnotify()このオブジェクトのモニターで待機中のスレッドを1つ再開します。final voidこのオブジェクトのモニターで待機中のすべてのスレッドを再開します。toString()オブジェクトの文字列表現を返します。final voidwait()現在のスレッドが目覚めるまで待機します。通常、notifiedまたはinterruptedです。final voidwait(long timeoutMillis) 現在のスレッドは、通常、notifiedまたはinterruptedであるか、一定のリアルタイムが経過するまで、目覚めるまで待機します。final voidwait(long timeoutMillis, int nanos) 現在のスレッドは、通常、notifiedまたはinterruptedであるか、一定のリアルタイムが経過するまで、目覚めるまで待機します。
-
メソッドの詳細
-
typeSwitch
public static CallSite typeSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 参照タイプのターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。 静的引数は、null以外で、String、Integer、ClassまたはEnumDesc型の大/小文字ラベルの配列です。返される
CallSiteのメソッド・ハンドルのタイプは、intという戻り型になります。 2つのパラメータがあります: 最初の引数はObjectインスタンス(target)で、2番目の引数はint(restart)になります。targetがnullの場合、コール・サイトのメソッドは -1を返します。targetがnullでない場合、コール・サイトのメソッドは、次のいずれかの条件に一致するrestart索引から始まるlabels配列内の最初の要素の索引を返します:- 要素のタイプが
Classで、ターゲット・クラスから割当て可能です。または - 要素のタイプは
StringまたはIntegerで、ターゲットと同等です。 - 要素のタイプは
EnumDescで、ターゲットと等しい定数を記述します。
labels配列内の要素がターゲットと一致しない場合、コール・サイトのメソッドはlabels配列の長さを返します。restart索引の値は、0(包含)からlabels配列(包含)の長さの間にある必要があります。そうでない場合、両方ともIndexOutOfBoundsExceptionがスローされます。- パラメータ:
lookup- コール元のアクセシビリティ権限を持つルックアップ・コンテキストを表します。invokedynamicで使用されるときは、これはVMによって自動的にスタックされます。invocationName- 未使用、nullが許可されているinvocationType- 2つのパラメータ(参照タイプ、intおよびint)を含むCallSiteの起動タイプ。labels- ケース・ラベル -StringおよびInteger定数と、任意の組合せのClassおよびEnumDescインスタンス- 戻り値:
- 前述のとおり、
CallSiteは最初の一致する要素を返します - スロー:
NullPointerException- 特に明記されていないかぎり、引数がnullの場合IllegalArgumentException- label配列の要素がnullの場合IllegalArgumentException- 呼出し型が参照型の最初のパラメータのメソッド型でない場合、int型の2番目のパラメータ、およびintの戻り型IllegalArgumentException-labelsにString型、Integer型、Long型、Float型、Double型、Boolean型、Class型またはEnumDesc型の要素が含まれている場合IllegalArgumentException-targetがBoolean.classの場合、labelsにBoolean型でない要素が含まれている場合- Java Virtual Machine仕様を参照してください:
-
「4.4.6 CONSTANT_NameAndType_info構造」
「4.4.10 CONSTANT_Dynamic_infoおよびCONSTANT_InvokeDynamic_info構造」
- 要素のタイプが
-
enumSwitch
public static CallSite enumSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 列挙型のターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。 静的引数は、switchコンストラクトに関連付けられたcaseのラベルのエンコードに使用されます。ここでは、各ラベルを2つの方法でエンコードできます:String値として、ラベルに関連付けられている列挙定数の名前を表しますClass値として、タイプ・テスト・パターンに関連付けられた列挙型を表します
返された
CallSiteのメソッド・ハンドルの戻り型はintで、2つのパラメータを受け入れます: 最初の引数はEnumインスタンス(target)で、2番目の引数はint(restart)になります。targetがnullの場合、コール・サイトのメソッドは -1を返します。targetがnullでない場合、コール・サイトのメソッドは、次のいずれかの条件に一致するrestart索引から始まるlabels配列内の最初の要素の索引を返します:- 要素のタイプが
Classで、ターゲット・クラスから割当て可能です。または - 要素のタイプは
Stringで、ターゲット列挙定数Enum.name()と同等です。
特定の
targetについて、前述の条件の1つを満たす要素がlabelsにない場合、コール・サイトのメソッドはlabels配列の長さを返します。restart索引の値は、0(この値を含む)とlabels配列の長さ(この値を含む)の間にする必要があります。そうしないと、IndexOutOfBoundsExceptionがスローされます。- APIのノート:
labels配列には、実行時にenum定数を表さないString値を含めることができます。- パラメータ:
lookup- コール元のアクセシビリティ権限を持つルックアップ・コンテキストを表します。invokedynamicで使用されるときは、これはVMによって自動的にスタックされます。invocationName- 未使用、nullが許可されているinvocationType- 2つのパラメータ(列挙型、intおよびintの戻り型)を持つCallSiteの起動タイプ。labels- ケース・ラベル -String定数およびClassインスタンスの任意の組合せ- 戻り値:
- 前述のとおり、
CallSiteは最初の一致する要素を返します - スロー:
NullPointerException- 特に明記されていないかぎり、引数がnullの場合IllegalArgumentException- label配列の要素がnullの場合IllegalArgumentException- label配列の要素が空のStringである場合IllegalArgumentException- 呼出し型が、最初のパラメータ型が列挙型であるメソッド型ではなく、int型の2番目のパラメータで、戻り型がintの場合IllegalArgumentException-labelsに、ターゲット列挙型と等しいString型またはClass型の要素が含まれていない場合- Java Virtual Machine仕様を参照してください:
-
「4.4.6 CONSTANT_NameAndType_info構造」
「4.4.10 CONSTANT_Dynamic_infoおよびCONSTANT_InvokeDynamic_info構造」
-