Класс 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 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

public PersistenceDelegate()

Методы

writeObject

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 вместо этого. Выполнение этих операторов обеспечивает постепенное выравнивание состояния двух объектов в виде ряда изменений объектов в новой среде. К моменту возврата метода инициализации сравнение двух экземпляров с помощью их публичных API должно быть невозможно. Самое важное, что последовательность шагов, использованных для того, чтобы сделать эти объекты эквивалентными, будет записана выходным потоком и сформирует фактический вывод при сбросе потока.

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

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

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

Spec-Zone .ru
спецификации, руководства, описания, API