Mengapa Java memiliki bidang sementara ?
Kata transient
kunci dalam Java digunakan untuk menunjukkan bahwa suatu bidang tidak boleh menjadi bagian dari proses serialisasi (yang berarti disimpan, seperti ke file).
Dari Spesifikasi Bahasa Jawa , Edisi Java SE 7 , Bagian 8.3.1.3. transient
Bidang :
Variabel dapat ditandai
transient
untuk menunjukkan bahwa mereka bukan bagian dari keadaan gigih suatu objek.
Misalnya, Anda mungkin memiliki bidang yang berasal dari bidang lain, dan seharusnya hanya dilakukan secara terprogram, alih-alih keadaan dipertahankan melalui serialisasi.
Inilah GalleryImage
kelas yang berisi gambar dan gambar mini 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
gambar thumbnail yang dihasilkan dengan memanggil generateThumbnail
metode.
The thumbnailImage
lapangan ditandai sebagai transient
, sehingga hanya asli image
serial daripada bertahan kedua gambar asli dan gambar thumbnail. Ini berarti bahwa penyimpanan yang 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, sehingga readObject
metode ditimpa sehingga thumbnail akan dihasilkan dengan memanggil generateThumbnail
metode.
Untuk informasi tambahan, temukan rahasia artikel Java Serialization API (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-bidang tertentu.
@DoNotSerialize
?Sebelum memahami
transient
kata kunci, kita harus memahami konsep serialisasi. Jika pembaca tahu tentang serialisasi, lewati poin pertama.Apa itu serialisasi?
Serialisasi adalah proses untuk membuat keadaan objek tetap. Itu berarti keadaan objek diubah menjadi aliran byte yang akan digunakan untuk bertahan (misalnya menyimpan byte dalam file) atau mentransfer (misalnya mengirim byte melalui jaringan). Dengan cara yang sama, kita dapat menggunakan deserialization untuk mengembalikan status objek dari byte. Ini adalah salah satu konsep penting dalam pemrograman Java karena serialisasi banyak digunakan dalam pemrograman jaringan. Objek-objek yang perlu ditransmisikan melalui jaringan harus dikonversi menjadi byte. Untuk tujuan itu, setiap kelas atau antarmuka harus mengimplementasikan
Serializable
antarmuka. Ini adalah antarmuka marker tanpa metode apa pun.Sekarang apa
transient
kata kunci dan tujuannya?Secara default, semua variabel objek bisa dikonversi menjadi status persisten. Dalam beberapa kasus, Anda mungkin ingin menghindari beberapa variabel karena Anda tidak perlu mempertahankan variabel-variabel tersebut. Jadi, Anda dapat mendeklarasikan variabel tersebut sebagai
transient
. Jika variabel dinyatakan sebagaitransient
, maka itu tidak akan bertahan. Itulah tujuan utamatransient
kata kunci.Saya ingin menjelaskan dua poin di atas dengan contoh berikut:
Dan hasilnya adalah sebagai berikut:
Nama Tengah dinyatakan sebagai
transient
, sehingga tidak akan disimpan dalam penyimpanan persisten.Sumber
sumber
NameFormatter
ke drive yang digunakantoString()
. Atau hal lain yang terkait dengan konfigurasi, atau tampilan, atau logika bisnis, ... yang bertentangan dengan data.Untuk memungkinkan Anda menentukan variabel yang tidak ingin Anda buat bersambung.
Dalam sebuah objek Anda mungkin memiliki informasi yang tidak ingin Anda buat bersambung / bertahan (mungkin referensi ke objek pabrik induk), atau mungkin tidak masuk akal untuk membuat cerita bersambung. Menandai ini sebagai 'sementara' berarti mekanisme serialisasi akan mengabaikan bidang ini.
sumber
Kontribusi kecil saya:
Apa itu bidang sementara?
Pada dasarnya, bidang apa pun yang dimodifikasi dengan
transient
kata kunci adalah bidang sementara.Mengapa bidang sementara dibutuhkan di Jawa?
Kata
transient
kunci memberi Anda kontrol atas proses serialisasi dan memungkinkan Anda mengecualikan beberapa properti objek dari proses ini. Proses serialisasi digunakan untuk bertahan objek Java, sebagian besar sehingga negara mereka dapat dipertahankan saat mereka ditransfer atau tidak aktif. Terkadang, masuk akal untuk tidak membuat serial atribut tertentu dari suatu objek.Bidang mana yang harus Anda tandai sementara?
Sekarang kita tahu tujuan dari
transient
kata kunci dan bidang sementara, penting untuk mengetahui bidang mana yang menandai sementara. Bidang statis juga tidak diserialisasi, jadi kata kunci yang sesuai juga akan melakukan trik. Tetapi ini mungkin merusak desain kelas Anda; Di sinilahtransient
kata kunci datang untuk menyelamatkan. Saya mencoba untuk tidak membiarkan bidang yang nilainya dapat diturunkan dari orang lain untuk serial, jadi saya tandai mereka sementara. Jika Anda memiliki bidang bernamainterest
yang nilainya dapat dihitung dari bidang lain (principal
,rate
&time
), tidak perlu diserialisasi.Contoh lain yang baik adalah dengan jumlah kata artikel. Jika Anda menyimpan seluruh artikel, benar-benar tidak perlu menyimpan jumlah kata, karena itu dapat dihitung ketika artikel menjadi "deserialized." Atau pikirkan tentang penebang;
Logger
contoh hampir tidak pernah perlu serial, sehingga dapat dibuat sementara.sumber
transient
transient
Sebuah
transient
variabel adalah variabel yang tidak dapat serial.Salah satu contoh kapan ini mungkin berguna yang muncul dalam pikiran adalah, variabel yang hanya masuk akal dalam konteks contoh objek tertentu dan yang menjadi tidak valid setelah Anda membuat serial dan deserialized objek. Dalam hal ini berguna untuk menjadikan variabel-variabel itu sebagai
null
gantinya sehingga Anda dapat menginisialisasi ulang mereka dengan data yang berguna saat dibutuhkan.sumber
transient
digunakan untuk menunjukkan bahwa bidang kelas tidak perlu diserialisasi. Mungkin contoh terbaik adalahThread
bidang. Biasanya tidak ada alasan untuk membuat serial aThread
, karena kondisinya sangat 'spesifik aliran'.sumber
A
mereferensikan kelas tidak serialerialB
(sepertiThread
pada contoh Anda), makaA
harus menandai referensi sebagaitransient
XOR harus mengabaikan proses serialisasi default untuk melakukan sesuatu yang masuk akal denganB
XOR mengasumsikan bahwa hanya subclass serializableB
yang benar-benar dirujuk. (jadi subclass yang sebenarnya harus mengurus induk "buruk" merekaB
) XOR menerima bahwa serialisasi akan gagal. Hanya dalam satu kasus (ditandai sebagai sementara)B
secara otomatis dan diam-diam dilewati.Sistem serialisasi selain yang asli Jawa juga dapat menggunakan pengubah ini. Hibernate, misalnya, tidak akan bertahan bidang ditandai dengan @Transient atau pengubah sementara . Terracotta juga menghormati pengubah ini.
Saya percaya arti kiasan dari pengubah adalah "bidang ini hanya untuk penggunaan dalam memori. Jangan bertahan atau memindahkannya di luar VM khusus ini dengan cara apa pun. Ini tidak portabel". yaitu Anda tidak dapat mengandalkan nilainya di ruang memori VM lain. Mirip volatile, Anda tidak bisa mengandalkan memori dan semantik utas tertentu.
sumber
transient
tidak akan menjadi kata kunci jika dirancang pada saat ini. Mereka mungkin menggunakan anotasi.Karena tidak semua variabel bersifat serializable
sumber
Sebelum saya menjawab pertanyaan ini, saya harus menjelaskan kepada Anda SERIALISASI , karena jika Anda mengerti apa artinya serialisasi dalam ilmu komputer Anda dapat dengan mudah memahami kata kunci ini.
Serialisasi Ketika suatu objek ditransfer melalui jaringan / disimpan pada media fisik (file, ...), objek tersebut harus "serial". Serialisasi mengubah seri objek status byte. Bytes ini dikirim pada jaringan / disimpan dan objek dibuat kembali dari byte ini.
Contoh
Sekarang JIKA ANDA INGIN lakukan TIDAK TRANSFERT / DISELAMATKAN bidang objek ini SO , Anda dapat menggunakan kata kunci
transient
Contoh
sumber
Ini diperlukan ketika Anda tidak ingin berbagi beberapa data sensitif yang disertai dengan serialisasi.
sumber
Thread
(kredit ke @AH misalnya), dalam hal ini Anda akan menandainya sebagai sementara. Namun, utas bukan data sensitif dalam dan dari dirinya sendiri, itu hanya tidak masuk akal logis untuk membuat cerita bersambung (dan itu tidak bisa serial).Sesuai google makna sementara == hanya berlangsung untuk waktu yang singkat; tidak permanen.
Sekarang jika Anda ingin membuat apa pun sementara di java gunakan kata kunci sementara.
T: di mana harus menggunakan transient?
A: Secara umum di java kita bisa menyimpan data ke file dengan memperolehnya dalam variabel dan menulis variabel itu ke file, proses ini dikenal sebagai Serialisasi. Sekarang jika kita ingin menghindari data variabel untuk ditulis ke file, kita akan menjadikan variabel itu sementara.
Catatan: variabel transien tidak bisa lokal.
sumber
Sederhananya, kata kunci java sementara melindungi bidang dari Serialize sebagai bagian penghitung bidang non-transien mereka.
Dalam potongan kode ini BaseJob abstrak kelas kami mengimplementasikan antarmuka Serializable, kami memperluas dari BaseJob tetapi kami tidak perlu membuat serial sumber remote dan sumber data lokal; serialkan hanya bidang organisasiNama dan isSynced.
sumber
Kode contoh sederhana untuk kata kunci sementara.
sumber
Bidang yang dideklarasikan dengan pengubah sementara tidak akan mengambil bagian dalam proses serial. Ketika suatu objek diserialisasi (disimpan dalam keadaan apa pun), nilai bidang transiennya diabaikan dalam representasi serial, sedangkan bidang selain bidang transien akan mengambil bagian dalam proses serialisasi. Itulah tujuan utama kata kunci sementara.
sumber