Spec-Zone.ru › OpenJDK 27

Класс 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
Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект какому-либо другому объекту.
protected void finalize()
Устарел и будет удален: этот элемент API подлежит удалению в будущей версии.
Финализация объявлена устаревшей и подлежит удалению в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать, пока он не будет разбужен, обычно посредством уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать, пока он не будет разбужен, обычно посредством уведомления или прерывания, либо пока не истечет заданное время.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать, пока он не будет разбужен, обычно посредством уведомления или прерывания, либо пока не истечет заданное время.

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

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, 2026, 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.

Spec-Zone.ru

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