Pertanyaan Mengapa Java memiliki bidang sementara?


Mengapa Java ada sementara ladang?


1202
2018-05-26 12:11


asal


Jawaban:


Itu transient kata kunci di Java digunakan untuk menunjukkan bahwa suatu bidang tidak boleh diserialkan.

Dari Spesifikasi Bahasa Jawa, Java SE 7 Edition, Bagian 8.3.1.3. transient Fields:

Variabel dapat ditandai transient untuk   menunjukkan bahwa mereka bukan bagian dari   keadaan terus-menerus suatu objek.

Misalnya, Anda mungkin memiliki bidang yang berasal dari bidang lain, dan hanya boleh dilakukan dengan cara yang terprogram, daripada membuat negara bertahan melalui serialisasi.

Ini a GalleryImage kelas yang berisi gambar dan thumbnail yang berasal dari gambar:

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();
    }    
}

Dalam contoh ini, thumbnailImage adalah gambar kecil yang dihasilkan dengan memohon generateThumbnail metode.

Itu thumbnailImage bidang ditandai sebagai transient, jadi hanya yang asli image adalah serial daripada bertahan baik gambar asli dan gambar thumbnail. Ini berarti bahwa penyimpanan lebih sedikit akan diperlukan untuk menyimpan objek serial. (Tentu saja, ini mungkin atau mungkin tidak diinginkan tergantung pada persyaratan sistem - ini hanya sebuah contoh.)

Pada saat deserialisasi, readObject metode dipanggil untuk melakukan operasi yang diperlukan untuk mengembalikan keadaan objek kembali ke keadaan di mana serialisasi terjadi. Di sini, thumbnail perlu dibuat, jadi readObject metode ditimpa sehingga thumbnail akan dibuat dengan memanggil generateThumbnail metode.

Untuk informasi tambahan, Temukan rahasia Java Serialization API artikel (yang semula tersedia di Sun Developer Network) memiliki bagian yang membahas penggunaan dan menyajikan skenario di mana transient kata kunci digunakan untuk mencegah serialisasi bidang tertentu.


1413
2018-05-26 12:53



Sebelum memahami transient kata kunci, kita harus memahami konsep serialisasi. Jika pembaca tahu tentang serialisasi, lewati titik pertama.

Apa itu serialisasi?

Serialisasi adalah proses membuat status objek tetap. Itu berarti keadaan objek diubah menjadi aliran byte dan disimpan dalam file. Dengan cara yang sama, kita dapat menggunakan deserialization untuk mengembalikan keadaan objek dari byte. Ini adalah salah satu konsep penting dalam pemrograman Java karena serialisasi banyak digunakan dalam pemrograman jaringan. Objek yang perlu dikirim melalui jaringan harus diubah menjadi byte. Untuk itu, setiap kelas atau antarmuka harus mengimplementasikan Serializable antarmuka. Ini adalah antarmuka penanda tanpa metode apa pun.

Sekarang apa itu transient kata kunci dan tujuannya?

Secara default, semua variabel objek diubah menjadi status persisten. Dalam beberapa kasus, Anda mungkin ingin menghindari beberapa variabel tetap karena Anda tidak memiliki kebutuhan untuk mempertahankan variabel-variabel tersebut. Jadi Anda dapat mendeklarasikan variabel tersebut sebagai transient. Jika variabel dideklarasikan sebagai transient, maka itu tidak akan bertahan. Itu adalah tujuan utama dari transient kata kunci.

Saya ingin menjelaskan dua poin di atas dengan contoh berikut:

package javabeat.samples;

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

class NameStore implements Serializable{
    private String firstName;
    private transient String middleName;
    private String lastName;

    public NameStore (String fName, String mName, String lName){
        this.firstName = fName;
        this.middleName = mName;
        this.lastName = lName;
    }

    public String toString(){
        StringBuffer sb = new StringBuffer(40);
        sb.append("First Name : ");
        sb.append(this.firstName);
        sb.append("Middle Name : ");
        sb.append(this.middleName);
        sb.append("Last Name : ");
        sb.append(this.lastName);
        return sb.toString();
    }
}

public class TransientExample{
    public static void main(String args[]) throws Exception {
        NameStore nameStore = new NameStore("Steve", "Middle","Jobs");
        ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("nameStore"));
        // writing to object
        o.writeObject(nameStore);
        o.close();

        // reading from object
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("nameStore"));
        NameStore nameStore1 = (NameStore)in.readObject();
        System.out.println(nameStore1);
    }
}

Dan hasilnya adalah sebagai berikut:

First Name : Steve
Middle Name : null
Last Name : Jobs

Nama tengah dinyatakan sebagai transient, sehingga tidak akan disimpan dalam penyimpanan persisten.

Sumber


354
2018-05-26 12:13



Untuk memungkinkan Anda mendefinisikan variabel yang tidak Anda inginkan untuk membuat serial.

Dalam suatu objek, Anda mungkin memiliki informasi yang tidak Anda inginkan bersambung / bertahan (mungkin referensi ke objek pabrik induk), atau mungkin tidak masuk akal untuk membuat serial. Menandai ini sebagai 'sementara' berarti mekanisme serialisasi akan mengabaikan bidang-bidang ini.


80
2018-03-18 22:04



Kontribusi kecil saya:

Apa itu variabel transien di Jawa?
Dalam kalimat sederhana setiap variabel yang dimodifikasi dengan kata kunci transien menjadi variabel sementara di java.

Mengapa kita membutuhkan variabel sementara di java?
Kata kunci transien memberi Anda kontrol atas proses serialisasi dan memberi Anda fleksibilitas untuk mengecualikan beberapa properti objek dari proses serialisasi. Kadang-kadang tidak masuk akal untuk tidak membuat serial atribut tertentu dari suatu objek, kita akan melihat variabel mana yang tidak harus diserialkan dan harus dibuat sementara di bagian berikutnya.

Variabel mana yang harus Anda tandai transien?
Karena kita tahu tujuan dari kata kunci transien atau memiliki variabel sementara, maka masuk akal untuk berpikir tentang variabel mana yang harus ditandai sebagai transien. Aturan saya adalah setiap variabel yang nilainya dapat dihitung dari variabel lain tidak perlu disimpan. Misalnya, jika Anda memiliki bidang bernama "minat" yang nilainya dapat berasal dari bidang lain mis. prinsip, nilai, waktu dll, maka tidak perlu membuat cerita bersambung.
Contoh lain adalah jumlah kata, jika Anda menyimpan artikel maka tidak perlu menyimpan jumlah kata, karena dapat dibuat ketika artikel menjadi deserialized. Contoh lain yang bagus dari kata kunci transien adalah "Logger" karena sebagian besar waktu Anda memiliki contoh logger untuk login di Jawa tetapi Anda tentu tidak ingin serial itu benar?


27
2018-05-26 12:15



SEBUAH transient variabel adalah variabel yang tidak dapat diserialkan.

Salah satu contoh saat ini mungkin berguna yang terlintas dalam pikiran adalah, variabel yang hanya masuk akal dalam konteks contoh objek tertentu dan yang menjadi tidak valid setelah Anda memiliki serial dan deserialized objek. Dalam hal ini berguna untuk memiliki variabel-variabel itu menjadi null sebagai gantinya Anda dapat menginisialisasi ulang mereka dengan data yang berguna saat diperlukan.


21
2018-03-26 14:16



transient digunakan untuk menunjukkan bahwa bidang kelas tidak perlu diserialkan. Mungkin contoh terbaik adalah a Thread bidang. Biasanya tidak ada alasan untuk bersambung Thread, karena negara bagiannya sangat 'mengalir spesifik'.


13
2018-05-26 12:15



Karena tidak semua variabel bersifat serializable


10
2018-05-28 02:20