Java に一時フィールドがあるのはなぜですか?
ベストアンサー1
Java のキーワードtransient
は、フィールドがシリアル化 (つまり、ファイルなどに保存される) プロセスの一部にならないことを示すために使用されます。
からJava 言語仕様、Java SE 7 エディション、セクション8.3.1.3.transient
フィールド:
変数は、
transient
オブジェクトの永続的な状態の一部ではないことを示すためにマークされる場合があります。
たとえば、他のフィールドから派生したフィールドがある場合、その状態をシリアル化によって永続化するのではなく、プログラムによってのみ実行する必要があります。
以下は、GalleryImage
画像と、その画像から派生したサムネイルを含むクラスです。
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
private void generateThumbnail()
{
// Generate thumbnail.
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
generateThumbnail();
}
}
この例では、 はメソッドthumbnailImage
を呼び出すことによって生成されるサムネイル イメージですgenerateThumbnail
。
フィールドthumbnailImage
は としてマークされているためtransient
、image
元の画像とサムネイル画像の両方が保持されるのではなく、元の画像のみがシリアル化されます。つまり、シリアル化されたオブジェクトを保存するために必要なストレージが少なくなります。(もちろん、システムの要件によっては、これが望ましい場合と望ましくない場合があります。これは単なる例です。)
デシリアライズ時に、readObject
メソッドは、オブジェクトの状態をシリアル化が発生した状態に戻すために必要な操作を実行するために呼び出されます。ここではサムネイルを生成する必要があるため、readObject
メソッドを呼び出すことによってサムネイルが生成されるようにメソッドがオーバーライドされますgenerateThumbnail
。
詳細は記事をご覧くださいJava シリアル化 API の秘密を探る(元々は Sun Developer Network で利用可能でした) には、 の使用法について説明し、transient
キーワードを使用して特定のフィールドのシリアル化を防止するシナリオを紹介するセクションがあります。