Spec-Zone.ru › OpenJDK 17

Класс 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, 2021, 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/17/docs/api/java.desktop/java/beans/PersistenceDelegate.html

Spec-Zone.ru

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