モジュール java.base
パッケージ java.lang.runtime

クラスSwitchBootstraps

java.lang.Object
java.lang.runtime.SwitchBootstraps

public class SwitchBootstraps extends Object
switch文の選択機能を実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。 ブートストラップは、switchcaseラベルに対応する追加の静的引数を取り、暗黙的に[0..N)から番号付けします。
導入されたバージョン:
21
  • メソッドの詳細

    • typeSwitch

      public static CallSite typeSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels)
      参照タイプのターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。 静的引数は、null以外で、StringIntegerClassまたはEnumDesc型の大/小文字ラベルの配列です。

      返されるCallSiteのメソッド・ハンドルのタイプは、intという戻り型になります。 2つのパラメータがあります: 最初の引数はObjectインスタンス(target)で、2番目の引数はint (restart)になります。

      targetnullの場合、コール・サイトのメソッドは -1を返します。

      targetnullでない場合、コール・サイトのメソッドは、次のいずれかの条件に一致する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)になります。

      targetnullの場合、コール・サイトのメソッドは -1を返します。

      targetnullでない場合、コール・サイトのメソッドは、次のいずれかの条件に一致する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構造」