Spec-Zone.ru › OpenJDK 21

Класс PersistenceDelegate

java.lang.Object
java.beans.PersistenceDelegate
Прямые известные подклассы:
DefaultPersistenceDelegate
public abstract class PersistenceDelegate extends Object
Класс PersistenceDelegate берёт на себя ответственность за выражение состояния экземпляра данного класса в терминах методов публичного API класса. Вместо того, чтобы связывать ответственность за сохранение с самим классом, как это делается, например, методами readObject и writeObject, используемыми ObjectOutputStream, потоки, такие как XMLEncoder, использующие эту модель делегирования, могут иметь своё поведение, контролируемое независимо от самих классов. Обычно, класс — лучшее место для размещения такой информации, и соглашения могут быть легко выражены в этой схеме делегирования, чтобы сделать именно это. Однако иногда случается, что незначительная проблема в одном классе препятствует сохранению всего графа объектов, и это может оставить разработчика приложения без возможности, кроме как попытаться локально затенить проблемные классы или использовать альтернативные методы сохранения. В таких ситуациях модель делегирования предоставляет относительно чистый механизм для разработчика приложения вмешиваться во все аспекты процесса сериализации без необходимости вносить изменения в реализацию классов, которые не являются частью самого приложения.

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

Делегат сохранения может контролировать все аспекты сохранения объекта, включая:

  • Решение о возможности изменения экземпляра в другой экземпляр того же класса.
  • Создание объекта, вызвав публичный конструктор или публичный фабричный метод.
  • Выполнение инициализации объекта.
С:
1.4
См. также:
  • XMLEncoder

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

PersistenceDelegate()
Модификатор Конструктор Описание
protected
Создаёт PersistenceDelegate.

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

Модификатор и тип Метод Описание
protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
Создаёт ряд утверждений со побочными эффектами на newInstance, так что новый экземпляр становится эквивалентным oldInstance.
protected abstract Expression instantiate(Object oldInstance, Encoder out)
Возвращает выражение, значение которого равно oldInstance.
protected boolean mutatesTo(Object oldInstance, Object newInstance)
Возвращает true, если эквивалентная копия oldInstance может быть создана путём применения ряда утверждений к newInstance.
void writeObject(Object oldInstance, Encoder out)
writeObject — единственная точка входа для сохранения и используется Encoder в традиционном режиме делегирования.

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

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

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

PersistenceDelegate

protected PersistenceDelegate()
Создаёт PersistenceDelegate.

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

writeObject

public void writeObject(Object oldInstance, Encoder out)
writeObject — единственная точка входа для сохранения и используется Encoder в традиционном режиме делегирования. Хотя этот метод не является final, в обычных обстоятельствах его не нужно подклассировать.

Эта реализация сначала проверяет, не встречался ли этот объект потоку ранее. Затем вызывается метод mutatesTo для проверки, может ли тот кандидат, возвращённый потоком, быть изменён в точную копию oldInstance.

Если да, вызывается метод initialize для выполнения инициализации. Если нет, кандидат удаляется из потока, и вызывается метод instantiate для создания нового кандидата для этого объекта.
Параметры:
oldInstance - Экземпляр, который будет создан этим выражением.
out - Поток, в который будет записано это выражение.
Исключения:
NullPointerException - если out является null

mutatesTo

protected boolean mutatesTo(Object oldInstance, Object newInstance)
Возвращает true, если эквивалентная копия oldInstance может быть создана путём применения ряда утверждений к newInstance. В спецификации этого метода под эквивалентностью подразумевается, что изменённый экземпляр неотличим от oldInstance в поведении соответствующих методов его публичного API. [Примечание: мы используем фразу соответствующие методы, а не все методы, только потому, что, для большей точности, методы, такие как hashCode и toString, препятствуют большинству классов от создания по-настоящему неотличимых копий своих экземпляров].

По умолчанию метод возвращает true если классы двух экземпляров одинаковы.

Параметры:
oldInstance - Экземпляр, подлежащий копированию.
newInstance - Экземпляр, который должен быть изменён.
Возвращает:
True, если эквивалентная копия newInstance может быть создана путём применения ряда изменений к oldInstance.

instantiate

protected abstract Expression instantiate(Object oldInstance, Encoder out)
Возвращает выражение, значение которого равно oldInstance. Этот метод используется для описания конструктора или фабричного метода, который должен использоваться для создания данного объекта. Например, метод instantiate делегата сохранения для класса Field может быть определён следующим образом:
 Field f = (Field)oldInstance;
 return new Expression(f, f.getDeclaringClass(), "getField", new Object[]{f.getName()});
 
Обратите внимание, что мы объявляем значение возвращаемого выражения, чтобы значение выражения (как возвращается getValue) было идентично oldInstance.
Параметры:
oldInstance - Экземпляр, который будет создан этим выражением.
out - Поток, в который будет записано это выражение.
Возвращает:
Выражение, значение которого равно oldInstance.
Исключения:
NullPointerException - если out является null и это значение используется в методе

initialize

protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
Создаёт ряд утверждений со побочными эффектами на newInstance, так что новый экземпляр становится эквивалентным oldInstance. В спецификации этого метода под эквивалентностью подразумевается, что после возвращения метода изменённый экземпляр неотличим от newInstance в поведении всех методов его публичного API.

Реализация, как правило, достигает этой цели, создавая ряд утверждений "что произошло" с участием oldInstance и его публично доступного состояния. Эти утверждения отправляются в выходной поток с помощью метода writeExpression, который возвращает выражение, включающее элементы в клонированной среде, моделирующей состояние входного потока во время чтения. Каждое возвращённое утверждение будет содержать все экземпляры старой среды, заменённые объектами, которые существуют в новой. В частности, ссылки на целевой объект этих утверждений, которые изначально являются ссылками на oldInstance, возвращаются как ссылки на newInstance вместо. Выполнение этих утверждений влияет на постепенное выравнивание состояния двух объектов как серии изменений в объектах новой среды. К тому времени, когда метод initialize возвращается, должно быть невозможно отличить два экземпляра с помощью их публичных API. Наиболее важно, что последовательность шагов, которые использовались для того, чтобы сделать эти объекты похожими, будет записана выходным потоком и будет сформирована фактический выходной данные, когда поток будет очищен.

По умолчанию реализация вызывает метод initialize суперкласса типа.

Параметры:
type - тип экземпляров
oldInstance - Экземпляр, подлежащий копированию.
newInstance - Экземпляр, который должен быть изменён.
out - Поток, в который должны быть записаны любые утверждения инициализации.
Исключения:
NullPointerException - если out является null

© 1993, 2023, 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/21/docs/api/java.desktop/java/beans/PersistenceDelegate.html

Spec-Zone.ru

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