Java 中的 transient 關鍵字

Mohammad Irfan 2023年10月12日
  1. 在 Java 中建立瞬態變數
  2. 在 Java 中的 Hibernate 實體類中建立瞬態變數
Java 中的 transient 關鍵字

本教程介紹了 transient 關鍵字是什麼以及如何在 Java 應用程式中使用它。

Transient 是 Java 中的一個關鍵字,用於將變數標記為不可序列化。當我們序列化一個物件時使用它。

序列化是將 Java 物件轉換為位元組流的過程。所以,它可以被持久化到一個檔案中,當我們想要避免任何欄位持久化到一個檔案中時,我們標記那個瞬態。

我們不能將任何方法標記為瞬態,而只能標記欄位。讓我們通過一些例子來理解。

要使類可序列化,我們首先需要實現 Seriablizable 介面,然後對變數使用瞬態關鍵字。下面是一個實現 Serializable 介面的可序列化類示例。但是,它不標記任何場瞬態。

class Student implements Serializable {
  /*
   *  non- transient fields
   */
  int id;
  String name;
  String email;
}

在 Java 中建立瞬態變數

在這個例子中,我們有一個類 Student,它實現了 Serializable 介面並將電子郵件標記為瞬態。因此,當我們將其狀態寫入檔案時,只會將 nameid 寫入檔案。email 資料未寫入。你可以通過讀取相同的檔案並將資料顯示到控制檯來驗證這一點。請參閱下面的示例。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SimpleTesting {
  public static void main(String[] args) throws IOException, ClassNotFoundException {
    Student student = new Student();
    student.setId(10);
    student.setName("Rohan");
    student.setEmail("rohan@gmail.com");

    // Writing to a file
    FileOutputStream fileStream = new FileOutputStream("student.txt");
    ObjectOutputStream outStream = new ObjectOutputStream(fileStream);
    outStream.writeObject(student);
    outStream.flush();
    outStream.close();
    fileStream.close();

    // Reading file
    ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("student.txt"));
    student = (Student) inputStream.readObject();
    System.out.println(student.id + " " + student.name + " " + student.email);
    System.out.println(Student.getSerialversionuid());
    inputStream.close();
  }
}

class Student implements Serializable {
  private static final long serialVersionUID = 1L;
  int id;
  String name;
  transient String email;

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public static long getSerialversionuid() {
    return serialVersionUID;
  }
}

輸出:

10 Rohan null 1

你可以在輸出中注意到電子郵件為空。

在 Java 中的 Hibernate 實體類中建立瞬態變數

如果你正在使用 hibernate 並希望使某些變數/欄位成為瞬態,請使用 @Transient 修飾符。它將跳過將資料寫入資料庫表。此註釋僅在你使用 hibernate 時有用,並且由於這是一個註釋,你必須將所有必需的 JAR 匯入到你的專案中。請參閱下面的示例。

@Entity
class Student implements Serializable {
  @Id int id;
  String name;
  @Transient String email; // transient

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
}