Класс PersistenceDelegate
- Прямые известные подклассы:
DefaultPersistenceDelegate
public abstract class PersistenceDelegate extends Object
readObject и writeObject, используемых в ObjectOutputStream, потоки, такие как XMLEncoder, в которых применяется эта модель делегирования, могут работать независимо от самих классов. Обычно такое описание лучше всего размещать в самом классе, и в этой схеме делегирования можно легко выразить соглашения, позволяющие именно так и поступить. Однако иногда небольшая проблема в одном классе мешает записать весь граф объектов, и разработчику приложения не остается ничего иного, кроме как попытаться локально затенить проблемные классы или использовать альтернативные методы сохранения состояния. В подобных ситуациях модель делегирования предоставляет разработчику приложения относительно простой механизм вмешательства во все этапы процесса сериализации, не требующий внесения изменений в реализацию классов, не являющихся частью самого приложения. Помимо использования модели делегирования, эта схема сохранения состояния отличается от традиционных схем сериализации тем, что требует аналога метода writeObject без соответствующего метода readObject. Аналог writeObject кодирует каждый экземпляр в терминах его открытого API, и определять аналог readObject не требуется, поскольку процедура чтения сериализованной формы задается семантикой вызова методов, установленной в спецификации языка Java. Разрыв зависимости между реализациями writeObject и readObject, которые могут меняться от версии к версии, — ключевой фактор, благодаря которому архивы, созданные с помощью этого подхода, не зависят от изменений закрытых реализаций классов, на которые они ссылаются.
Делегат сохранения состояния может управлять всеми аспектами сохранения объекта, включая:
- Определение того, можно ли преобразовать экземпляр в другой экземпляр того же класса.
- Создание объекта путем вызова открытого конструктора или открытого фабричного метода.
- Инициализацию объекта.
- С версии:
- 1.4
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Создает PersistenceDelegate. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
protected void |
initialize |
Создает последовательность операторов, оказывающих побочное действие на newInstance, чтобы новый экземпляр стал эквивалентен oldInstance. |
protected abstract Expression |
instantiate |
Возвращает выражение, значение которого равно oldInstance. |
protected boolean |
mutatesTo |
Возвращает true, если эквивалентную копию oldInstance можно создать, применив последовательность операторов к newInstance. |
void |
writeObject |
Метод writeObject является единой точкой входа для сохранения состояния и используется Encoder в традиционном режиме делегирования. |
Подробное описание конструкторов
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)
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, 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