Java での Transient

Mohammad Irfan 2023年10月12日
  1. Java で transient 変数を作成する
  2. Java の Hibernate エンティティクラスで一時変数を作成する
Java での Transient

このチュートリアルでは、transient キーワードとは何か、および Java のアプリケーションでそれを使用する方法を紹介します。

transient は、変数をシリアル化不可としてマークするために使用される Java のキーワードです。オブジェクトをシリアル化するときに使用されます。

シリアル化は、Java オブジェクトをバイトのストリームに変換するプロセスです。したがって、ファイルに永続化することができ、フィールドがファイルに永続化するのを避けたい場合は、その一時的なものとしてマークを付けます。

一時的なメソッドをマークすることはできませんが、フィールドのみをマークします。いくつかの例で理解しましょう。

クラスをシリアライズ可能にするには、最初に Seriablizable インターフェースを実装してから、変数で transient キーワードを使用する必要があります。以下は、Serializable インターフェースを実装するシリアライズ可能なクラスの例です。ただし、フィールドトランジェントはマークされません。

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

Java で transient 変数を作成する

この例では、Serializable インターフェースを実装し、電子メールを一時的なものとしてマークするクラス Student があります。したがって、その状態をファイルに書き込む場合、nameid のみがファイルに書き込まれます。メールデータは書き込まれません。同じファイルを読み取り、データをコンソールに表示することで、それを確認できます。以下の例を参照してください。

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

電子メールが null であることが出力でわかります。

Java の Hibernate エンティティクラスで一時変数を作成する

hibernate を使用していて、一部の変数/フィールドを一時的にしたい場合は、@Transient 修飾子を使用します。データベーステーブルへのデータの書き込みをスキップします。このアノテーションは、休止状態で作業している場合にのみ役立ちます。これはアノテーションであるため、必要なすべての 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;
  }
}