Перейти к основному содержимому

Переходное ключевое слово в Java

· 3 мин. чтения

1. Введение

В этой статье мы сначала разберемся с ключевым словом transient , а затем рассмотрим его поведение на примерах.

2. Использование переходного процесса

Давайте сначала разберемся с сериализацией, прежде чем перейти к переходу, поскольку он используется в контексте сериализации.

Сериализация — это процесс преобразования объекта в поток байтов, а десериализация — противоположность ему .

Когда мы помечаем любую переменную как переходную, эта переменная не сериализуется . Поскольку переходные поля отсутствуют в сериализованной форме объекта, процесс десериализации будет использовать значения по умолчанию для таких полей при создании объекта из сериализованной формы.

Ключевое слово transient полезно в нескольких сценариях:

  • Мы можем использовать его для производных полей
  • Это полезно для полей, которые не представляют состояние объекта.
  • Мы используем его для любых несериализуемых ссылок

3. Пример

Чтобы увидеть это в действии, давайте сначала создадим класс Book , объект которого мы хотели бы сериализовать:

public class Book implements Serializable {
private static final long serialVersionUID = -2936687026040726549L;
private String bookName;
private transient String description;
private transient int copies;

// getters and setters
}

Здесь мы пометили описание и копии как временные поля.

После создания класса мы создадим объект этого класса:

Book book = new Book();
book.setBookName("Java Reference");
book.setDescription("will not be saved");
book.setCopies(25);

Теперь мы сериализуем объект в файл:

public static void serialize(Book book) throws Exception {
FileOutputStream file = new FileOutputStream(fileName);
ObjectOutputStream out = new ObjectOutputStream(file);
out.writeObject(book);
out.close();
file.close();
}

Теперь давайте десериализуем объект из файла:

public static Book deserialize() throws Exception {
FileInputStream file = new FileInputStream(fileName);
ObjectInputStream in = new ObjectInputStream(file);
Book book = (Book) in.readObject();
in.close();
file.close();
return book;
}

Наконец, мы проверим значения объекта book :

assertEquals("Java Reference", book.getBookName());
assertNull(book.getDescription());
assertEquals(0, book.getCopies());

Здесь мы видим, что bookName правильно сохранен. С другой стороны, поле копий имеет значение 0 , а описание равно null — значения по умолчанию для соответствующих типов данных — вместо исходных значений.

4. Поведение с финалом

Теперь давайте рассмотрим случай, когда мы будем использовать переходный процесс с ключевым словом final . Для этого сначала мы добавим последний переходный элемент в наш класс Book , а затем создадим пустой объект Book :

public class Book implements Serializable {
// existing fields

private final transient String bookCategory = "Fiction";

// getters and setters
}
Book book = new Book();

Модификатор final не имеет значения — поскольку поле является переходным , для этого поля не сохраняется никакое значение. Во время десериализации новый объект Book получает значение по умолчанию Fiction , определенное в классе Book , но это значение не берется из данных сериализации:

assertEquals("Fiction", book.getBookCategory());

5. Вывод

В этой статье мы увидели использование ключевого слова transient и его поведение при сериализации и десериализации.

Как всегда, весь код доступен на GitHub .