Класс 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 void |
initialize(Class<?> type,
Object oldInstance,
Object newInstance,
Encoder out) Производит серию операторов с побочными эффектами на |
protected abstract Expression |
instantiate(Object oldInstance,
Encoder out) Возвращает выражение, значение которого |
protected boolean |
mutatesTo(Object oldInstance,
Object newInstance) Возвращает true, если эквивалентная копия |
void |
writeObject(Object oldInstance,
Encoder out)
|
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
PersistenceDelegate
public PersistenceDelegate()
Методы
writeObject
public void writeObject(Object oldInstance,
Encoder out) writeObject — это единственная точка входа в сохранение и используется Encoder в традиционном режиме делегирования. Хотя этот метод не является финальным, он обычно не должен нуждаться в подклассировании.
Эта реализация сначала проверяет, сталкивался ли поток уже с этим объектом. Затем вызывается метод 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, 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.