Spec-Zone.ru › OpenJDK 25

Класс StringConcatFactory

java.lang.Object
java.lang.invoke.StringConcatFactory
public final class StringConcatFactory extends Object

Методы для упрощения создания методов конкатенации строк, которые можно использовать для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов. Обычно эти методы используются как методы начальной загрузки для точек вызова invokedynamic, обеспечивая поддержку возможности конкатенации строк в языке программирования Java.

К косвенному доступу к поведению, заданному предоставленным MethodHandle, переходят последовательно в две фазы:

  1. Связывание происходит при вызове методов этого класса. В качестве аргументов они принимают тип метода, описывающий число и типы конкатенируемых аргументов, а также, при необходимости, строковый рецепт и константы, участвующие в конкатенации строк. Подробнее о допустимых формах рецептов см. ниже. Связывание может включать динамическую загрузку нового класса, реализующего требуемое поведение конкатенации. CallSite содержит MethodHandle, указывающий на конкретный метод конкатенации. Методы конкатенации могут совместно использоваться разными CallSite, например, если методы связывания создают их как чистые функции.
  2. Вызов происходит при вызове сгенерированного метода конкатенации с конкретными динамическими аргументами. Один и тот же метод конкатенации может вызываться много раз. Метод, на который ссылается MethodHandle поведения, вызывается со статическими аргументами и любыми дополнительными динамическими аргументами, переданными при вызове, как если бы это было сделано с помощью MethodHandle.invoke(Object...).

Этот класс предоставляет две формы методов связывания: простую версию (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

Краткое описание методов

Модификатор и тип Метод Описание
static CallSite makeConcat(MethodHandles.Lookup lookup, String name, MethodType concatType)
Упрощает создание оптимизированных методов конкатенации строк, которые можно использовать для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов.
static CallSite makeConcatWithConstants(MethodHandles.Lookup lookup, String name, MethodType concatType, String recipe, Object... constants)
Упрощает создание оптимизированных методов конкатенации строк, которые можно использовать для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание методов

makeConcat

public static CallSite makeConcat(MethodHandles.Lookup lookup, String name, MethodType concatType) throws StringConcatException
Упрощает создание оптимизированных методов конкатенации строк, которые можно использовать для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов. Обычно используется как метод начальной загрузки для точек вызова invokedynamic, обеспечивая поддержку возможности конкатенации строк в языке программирования Java.

При вызове цели CallSite, возвращаемой этим методом, она возвращает результат конкатенации строк, используя в качестве входных данных все аргументы функции, переданные методу связывания. Сигнатура цели задается concatType. Для цели, принимающей:

  • ноль входных данных — результатом конкатенации будет пустая строка;
  • одну входную величину — результатом конкатенации будет единственная входная величина, преобразованная согласно разделу 5.1.11 JLS «Преобразование в строку»; в противном случае
  • две или более входных величин — входные величины конкатенируются согласно требованиям, изложенным в разделе 15.18.1 JLS «Оператор конкатенации строк +». Входные величины преобразуются согласно разделу 5.1.11 JLS «Преобразование в строку» и объединяются слева направо.

Предположим, что аргументы связывания имеют следующий вид:

  • concatType, описывающий сигнатуру CallSite

Тогда должны выполняться следующие инварианты связывания:

  • Число слотов параметров в concatType не превышает 200
  • Тип возвращаемого значения в concatType является супертипом String
Параметры:
lookup — представляет контекст поиска с правами доступа вызывающего кода. В частности, контекст поиска должен иметь полный доступ с привилегиями. При использовании с invokedynamic этот параметр автоматически добавляется виртуальной машиной.
name — имя реализуемого метода. Это имя произвольное и не имеет значения для данного метода связывания. При использовании с invokedynamic оно предоставляется NameAndType структуры InvokeDynamic и автоматически добавляется виртуальной машиной.
concatType — ожидаемая сигнатура CallSite. Типы параметров соответствуют типам аргументов конкатенации; тип возвращаемого значения всегда является супертипом String. При использовании с invokedynamic она предоставляется NameAndType структуры InvokeDynamic и автоматически добавляется виртуальной машиной.
Возвращает:
CallSite, цель которого можно использовать для выполнения конкатенации строк с динамическими аргументами конкатенации, описанными указанным concatType.
Вызывает исключение:
StringConcatException — если нарушен какой-либо из описанных здесь инвариантов связывания или контекст поиска не имеет прав на закрытый доступ.
NullPointerException — если какой-либо входной аргумент равен null. Этого никогда не произойдет, когда метод начальной загрузки вызывается с помощью invokedynamic.
См. Спецификацию языка Java:
5.1.11 Преобразование в строку
15.18.1 Оператор конкатенации строк +

makeConcatWithConstants

public static CallSite makeConcatWithConstants(MethodHandles.Lookup lookup, String name, MethodType concatType, String recipe, Object... constants) throws StringConcatException
Упрощает создание оптимизированных методов конкатенации строк, которые можно использовать для эффективной конкатенации известного числа аргументов известных типов, возможно, после адаптации типов и частичного вычисления аргументов. Обычно используется как метод начальной загрузки для точек вызова invokedynamic, обеспечивая поддержку возможности конкатенации строк в языке программирования Java.

При вызове цели CallSite, возвращаемой этим методом, она возвращает результат конкатенации строк, используя в качестве входных данных все аргументы функции и константы, переданные методу связывания. Сигнатура цели задается concatType и не включает константы. Для цели, принимающей:

  • ноль входных данных — результатом конкатенации будет пустая строка;
  • одну входную величину — результатом конкатенации будет единственная входная величина, преобразованная согласно разделу 5.1.11 JLS «Преобразование в строку»; в противном случае
  • две или более входных величин — входные величины конкатенируются согласно требованиям, изложенным в разделе 15.18.1 JLS «Оператор конкатенации строк +». Входные величины преобразуются согласно разделу 5.1.11 JLS «Преобразование в строку» и объединяются слева направо.

Рецепт конкатенации — это строковое описание способа создания результирующей строки из аргументов и констант. Рецепт обрабатывается слева направо, каждый символ представляет собой входную величину для конкатенации. Символы рецепта имеют следующее значение:

  • \1 (кодовая точка Unicode 0001): обычный аргумент. Эта входная величина передается как динамический аргумент и предоставляется при вызове метода конкатенации. Эта входная величина может быть null.
  • \2 (кодовая точка Unicode 0002): константа. Эта входная величина передается как статический аргумент начальной загрузки. Константой может быть любое значение, представимое в пуле констант. При необходимости фабрика вызовет toString для однократного преобразования в строку.
  • Любое другое значение char: символьная константа.

Предположим, что аргументы связывания имеют следующий вид:

  • concatType, описывающий сигнатуру CallSite
  • recipe, описывающий строковый рецепт
  • constants, массив аргументов переменной длины с константами

Тогда должны выполняться следующие инварианты связывания:

  • Число слотов параметров в concatType не превышает 200
  • Число параметров в concatType равно числу меток \1 в recipe
  • Тип возвращаемого значения в concatType является супертипом String и совпадает с типом возвращаемого значения возвращенного MethodHandle
  • Число элементов в constants равно числу меток \2 в recipe
Примечание к API:
Генераторы кода могут использовать три разных способа обработки строкового константного операнда S в выражении конкатенации строк. Во-первых, S можно материализовать как ссылку (с помощью ldc) и передать как обычный аргумент (рецепт '\1'). Либо S можно сохранить в пуле констант и передать как константу (рецепт '\2'). Наконец, если S не содержит ни одного из символов-маркеров рецепта ('\1', '\2'), то S можно встроить непосредственно в рецепт, добавив его символы в результат.
Параметры:
lookup — представляет контекст поиска с правами доступа вызывающего кода. В частности, контекст поиска должен иметь полный доступ с привилегиями. При использовании с invokedynamic этот параметр автоматически добавляется виртуальной машиной.
name — имя реализуемого метода. Это имя произвольное и не имеет значения для данного метода связывания. При использовании с invokedynamic оно предоставляется NameAndType структуры InvokeDynamic и автоматически добавляется виртуальной машиной.
concatType — ожидаемая сигнатура CallSite. Типы параметров соответствуют типам динамических аргументов конкатенации; тип возвращаемого значения всегда является супертипом String. При использовании с invokedynamic она предоставляется NameAndType структуры InvokeDynamic и автоматически добавляется виртуальной машиной.
recipe — рецепт конкатенации, описанный выше.
constants — параметр переменной длины, представляющий константы, переданные методу связывания.
Возвращает:
CallSite, цель которого можно использовать для выполнения конкатенации строк с динамическими аргументами конкатенации, описанными указанным concatType.
Вызывает исключение:
StringConcatException — если нарушен какой-либо из описанных здесь инвариантов связывания или контекст поиска не имеет прав на закрытый доступ.
NullPointerException — если какой-либо входной аргумент равен null или какая-либо константа в recipe равна null. Этого никогда не произойдет, когда метод начальной загрузки вызывается с помощью invokedynamic.
См. Спецификацию языка Java:
5.1.11 Преобразование в строку
15.18.1 Оператор конкатенации строк +

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее дочерних компаний в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее дочерние компании, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/invoke/StringConcatFactory.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API