Spec-Zone.ru › OpenJDK 25

Класс 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 в традиционном режиме делегирования.

Методы, объявленные в классе 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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по 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.desktop/java/beans/PersistenceDelegate.html

Spec-Zone.ru

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