Transient что это
transient — tran‧si‧ent [ˈtrænziənt ǁ ˈtrænʆnt] adjective formal only lasting for a short period of time: • Customer loyalty in the health drinks market appears transient at the best of times. * * * transient UK US /ˈtrænziənt/ adjective ► something that is … Financial and business terms
transient — adj Transient, transitory, passing, ephemeral, momentary, fugitive, fleeting, evanescent, short lived are comparable when they mean lasting or staying only for a short time. Transient and transitory are often used as if they were interchangeable; … New Dictionary of Synonyms
transient — (adj.) c.1600, from L. transiens (acc. transientem) passing over or away, prp. of transire cross over, pass away, from trans across (see TRANS (Cf. trans )) + ire to go (see ION (Cf. ion)). The noun is first attested 1650s; specific sense of … Etymology dictionary
transient — ► ADJECTIVE 1) lasting only for a short time. 2) staying or working in a place for a short time only. ► NOUN ▪ a transient person. DERIVATIVES transience noun transiency noun transiently adverb … English terms dictionary
Transient — Tran sient, n. That which remains but for a brief time. Glanvill. [1913 Webster] … The Collaborative International Dictionary of English
Transĭent — (lat.), der Gegensatz zu »immanent« (s. d. und Transĕunt) … Meyers Großes Konversations-Lexikon
transient и final
Рассмотрим такой пример. Модифицируем класс User из примера выше и добавим в него новое поле, которое будет константой c информацией о роли пользователя: А затем еще раз запустим метод main из первого примера: То мы увидим следующий вывод: Обратите внимание, что поле role , которое мы пометили модификатором transient , все равно подверглось сериализации. Дело в том, что Java сериализует все константы класса, независимо от того, есть или нет модификатор transient . При этом ни на этапе компиляции, ни в IDE вы не увидите ошибок. Эту маленькую деталь стоит просто держать в голове, где-то очень глубоко, и возможно, вы не удивитесь, когда столкнетесь с таким на практике.
Что скрывает модификатор transient в Java
Модификатор (ну наконец-таки) transient
Модификатор transient
Допустим наш класс содержит ссылку на какой-нибудь InputStream, тогда его нельзя сериализовать, ведь так?
Для таких случаев разработчики Java придумали специальное слово – transient . Его можно написать перед переменной класса и она не будет учитываться при сериализации. Ее состояние не будет ни сохраняться, ни восстанавливаться. Как будто и нет ее вовсе. Как раз для таких ситуаций, как мы только что рассмотрели.
Помнишь кеширование и модификатор volatile ? Нет правил без исключений.
Вспомним сериализацию на практике
Что же, теперь рассмотрим сериализацию на практике. Если хочется получше разобраться в теме, советуем почитать материал Сериализация и десериализация в Java. Ну а в этой статье мы пройдемся по верхам и перейдем сразу к примерам. Предположим, у нас есть класс User с набором некоторых полей, геттерами и сеттерами, а также методом toString : Мы хотим сериализовывать объекты данного класса в дальнейшем. Напишем метод, который принимает объект User и строку path — путь до файла, в котором мы сохраним байты: Также напишем метод для десериализации. Метод принимает строку path (путь до файла из которого объект будет “загружен”) и возвращает объект типа User : Все инструменты готовы к работе. Пришло время расщеплять на атомы байты. Напишем метод main , в котором создадим объект класса User и сериализуем его. Затем загрузим и сравним с тем, что было изначально: Если запустить метод, мы увидим следующий вывод: Как видно из вывода, объекты идентичны. Но есть маленькое но… И это как раз то место, когда в игру вступает испанский стыд transient .
Когда использовать transient?
Пример с пользователем был нужен для того, чтобы погрузиться в контекст сериализации. Теперь поговорим предметнее о том, когда следует использовать модификатор transient .
В некоторых классах иногда бывают такие поля, которые вычисляются на основе других полей или же другой информации. Вычисляются, так сказать, на лету. Чтобы привести пример такого поля, представим себе заказ в интернет-магазине или же в каком-нибудь сервисе доставки еды. Каждый заказ, помимо прочей информации, состоит из списка товаров и итоговой стоимости. Она, в свою очередь, складывается из суммарной стоимости каждого товара. Выходит, что итоговую стоимость не стоит задавать “руками”: ее нужно вычислять программно, суммируя стоимость всех товаров. Подобные поля, которые следует вычислять программно, не нужно сериализовывать. Поэтому помечаем их модификатором transient .
Также бывают некоторые классы, которые хранят приватную информацию. Пример такого класса мы рассматривали в начале статьи. Не стоит допускать утечки такой информации за пределы JVM. Поэтому поля с подобными данными необходимо помечать модификатором transient , если вы собираетесь сериализовывать такой класс.
- Поля, которые не реализуют интерфейс Serializable
Иногда класс содержит поля — объекты других классов, которые не реализуют интерфейс Serializable . Пример таких полей — логгеры, потоки ввода-вывода, объекты, которые хранят соединения с базой данных и прочие служебные классы. Если попытаться сериализовать объект, который содержит несериализуемые поля, возникнет ошибка java.io.NotSerializableException . Чтобы избежать этого, все поля, которые не реализуют интерфейс Serializable , необходимо помечать модификатором transient .
Ну и последнее. Не нужно сериализовывать поля, которые не являются частью информации о состоянии объекта. Примеры выше попадают под это правило. Но также сюда можно включить и все прочие поля, добавленные для дебага или для выполнения какой то служебной функции, которые не несут информации о состоянии объекта.
Вспомним сериализацию
- Считать набор байтов из файла.
- Сконструировать из данного набора байтов исходный объект и задать каждому полю значение, которое было у объекта на момент сериализации.
transient
transient — tran‧si‧ent [ˈtrænziənt ǁ ˈtrænʆnt] adjective formal only lasting for a short period of time: • Customer loyalty in the health drinks market appears transient at the best of times. * * * transient UK US /ˈtrænziənt/ adjective ► something that is … Financial and business terms
transient — adj Transient, transitory, passing, ephemeral, momentary, fugitive, fleeting, evanescent, short lived are comparable when they mean lasting or staying only for a short time. Transient and transitory are often used as if they were interchangeable; … New Dictionary of Synonyms
transient — (adj.) c.1600, from L. transiens (acc. transientem) passing over or away, prp. of transire cross over, pass away, from trans across (see TRANS (Cf. trans )) + ire to go (see ION (Cf. ion)). The noun is first attested 1650s; specific sense of … Etymology dictionary
transient — ► ADJECTIVE 1) lasting only for a short time. 2) staying or working in a place for a short time only. ► NOUN ▪ a transient person. DERIVATIVES transience noun transiency noun transiently adverb … English terms dictionary
Transient — Tran sient, n. That which remains but for a brief time. Glanvill. [1913 Webster] … The Collaborative International Dictionary of English
Transĭent — (lat.), der Gegensatz zu »immanent« (s. d. und Transĕunt) … Meyers Großes Konversations-Lexikon
Читайте также: