Java に一時フィールドがあるのはなぜですか? 質問する

Java に一時フィールドがあるのはなぜですか? 質問する

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は としてマークされているためtransientimage元の画像とサムネイル画像の両方が保持されるのではなく、元の画像のみがシリアル化されます。つまり、シリアル化されたオブジェクトを保存するために必要なストレージが少なくなります。(もちろん、システムの要件によっては、これが望ましい場合と望ましくない場合があります。これは単なる例です。)

デシリアライズ時に、readObjectメソッドは、オブジェクトの状態をシリアル化が発生した状態に戻すために必要な操作を実行するために呼び出されます。ここではサムネイルを生成する必要があるため、readObjectメソッドを呼び出すことによってサムネイルが生成されるようにメソッドがオーバーライドされますgenerateThumbnail

詳細は記事をご覧くださいJava シリアル化 API の秘密を探る(元々は Sun Developer Network で利用可能でした) には、 の使用法について説明し、transientキーワードを使用して特定のフィールドのシリアル化を防止するシナリオを紹介するセクションがあります。

おすすめ記事