switch
文の選択機能を実装するinvokedynamic
コール・サイトをリンクするためのブートストラップ・メソッド。 ブートストラップは、switch
のcase
ラベルに対応する追加の静的引数を取り、暗黙的に[0..N)
から番号付けします。 - 導入されたバージョン:
- 21
-
メソッドのサマリー
修飾子と型メソッド説明static CallSite
enumSwitch
(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 列挙型のターゲットにswitch
を実装するinvokedynamic
コール・サイトをリンクするためのブートストラップ・メソッド。static CallSite
typeSwitch
(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 参照タイプのターゲットにswitch
を実装するinvokedynamic
コール・サイトをリンクするためのブートストラップ・メソッド。
-
メソッドの詳細
-
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
(inclusive)からlabels
配列(inclusive)の長さの間にある必要があります。そうでない場合、両方ともIndexOutOfBoundsException
がスローされます。- パラメータ:
lookup
- コール元のアクセシビリティ権限を持つルックアップ・コンテキストを表します。invokedynamic
で使用されるときは、これはVMによって自動的にスタックされます。invocationName
- 未使用invocationType
- 2つのパラメータ(参照タイプ、int
およびint
)を含むCallSite
の起動タイプ。labels
- ケース・ラベル -String
およびInteger
定数と、任意の組合せのClass
およびEnumDesc
インスタンス- 戻り値:
- 前述のとおり、
CallSite
は最初の一致する要素を返します - 例外:
NullPointerException
- 引数が1つの場合はnull
IllegalArgumentException
- ラベル配列の要素のいずれかがnullの場合、起動タイプが参照型の最初のパラメータのメソッド・タイプでない場合、型がint
で戻り型がint
の2番目のパラメータ、または型がString
,Integer
,Class
またはEnumDesc
ではない要素がlabels
に含まれている場合。- 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()
と同等です。
labels
配列内の要素がターゲットと一致しない場合、コール・サイトのメソッドはlabels
配列の長さを返します。restart
索引の値は、0
(inclusive)からlabels
配列(inclusive)の長さの間にある必要があります。そうでない場合、両方ともIndexOutOfBoundsException
がスローされます。- パラメータ:
lookup
- コール元のアクセシビリティ権限を持つルックアップ・コンテキストを表します。invokedynamic
で使用されるときは、これはVMによって自動的にスタックされます。invocationName
- 未使用invocationType
- 2つのパラメータ(列挙型、int
およびint
の戻り型)を持つCallSite
の起動タイプ。labels
- ケース・ラベル -String
定数およびClass
インスタンスの任意の組合せ- 戻り値:
- 前述のとおり、
CallSite
は最初の一致する要素を返します - 例外:
NullPointerException
- 引数が1つの場合はnull
IllegalArgumentException
- ラベル配列内のいずれかの要素がNULLの場合、起動タイプが、最初のパラメータ・タイプが列挙型であるメソッド・タイプではない場合、int
型の2番目のパラメータ、戻り型がint
である場合、またはlabels
にターゲット列挙型のString
またはClass
型ではない要素が含まれる場合。- Java Virtual Machine仕様を参照してください:
-
「4.4.6 CONSTANT_NameAndType_info構造」
「4.4.10 CONSTANT_Dynamic_infoおよびCONSTANT_InvokeDynamic_info構造」
-