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

クラスStringConcatFactory

java.lang.Object
java.lang.invoke.StringConcatFactory

public final class StringConcatFactory extends Object

String連結メソッドの作成を容易にするメソッド。これは、既知の型の既知の数の引数を効率的に連結するために使用でき、型の適応後や引数の部分評価後にも使用できます。 これらのメソッドは、通常、Javaプログラミング言語の「文字列連結」機能をサポートするために、 invokedynamicコール・サイトの「ブートストラップ法」として使用されます。

提供された MethodHandleで指定された動作への間接アクセスは、2つのフェーズを経て順番に進みます:

  1. リンケージ。このクラスのメソッドが呼び出されたときに発生します。 これらは、引数として、連結された引数の数と型を記述するメソッド型、およびオプションで文字列recipeと、文字列連結に参加する定数を取ります。 受け入れられるレシピ・シェイプの詳細は、後述します。 リンケージには、想定される連結動作を実装する新しいクラスが動的にロードされる場合があります。 CallSiteは、正確な連結メソッドを指すMethodHandleを保持します。 連結メソッドは、異なるCallSite間で共有できます。たとえば、リンケージ・メソッドによって純粋な関数として生成される場合です。
  2. 「呼び出し」は、生成された連結メソッドが正確な動的引数とともに呼び出されたときに発生します。 これは、単一の連結メソッドで何度も発生する可能性があります。 動作 MethodHandleによって参照されるメソッドは、MethodHandle.invoke(Object...)のように、起動時に提供される静的引数および追加の動的引数を使用して呼び出されます。

このクラスは、2つの形式のリンケージ・メソッド: 動的引数のみを使用する単純バージョン(makeConcat(java.lang.invoke.MethodHandles.Lookup, String, MethodType))および拡張バージョン(定数引数の取得の高度な形式を使用するmakeConcatWithConstants(java.lang.invoke.MethodHandles.Lookup, String, MethodType, String, Object...))。 高度な戦略では、実行時に存在する文字列連結メソッドのシェイプの数を分解する代わりに、呼び出しバイトコードが大幅に改善される可能性があります。これらのシェイプには一定の静的引数も含まれるためです。

APIのノート:

JVMの制限があります(クラス・ファイル構造制約): 255個を超えるスロットではメソッドをコールできません。 これにより、ブートストラップ・メソッドに渡すことができる静的引数および動的引数の数が制限されます。 MethodHandleコンビネータを使用する可能性のある連結方法があるため、時間的な結果を取得するには、パラメータ・リストにいくつかの空のスロットを予約する必要があります。 このため、このファクトリのブートストラップ・メソッドは200を超える引数スロットを受け入れません。 200個を超える引数スロットを連結で必要とするユーザーは、大きい連結を小さい式で分割することが期待されます。

導入されたバージョン:
9