被遺忘的Java關(guān)鍵字transient的使用詳解
前言
今天在看項目代碼時候,看到了下面這樣一行代碼,用transient修飾了一個變量,主要作用是做一個全局開關(guān)。說實話我是第一次看到這個關(guān)鍵字。激發(fā)了我的好奇心,所以就了解一下這是何方神圣。
/**
* 全局開關(guān)
*/
public static transient boolean running = true;transient 是什么
在 Java 中,transient 是一個關(guān)鍵字,用于指定一個類的字段(成員變量)在序列化時應(yīng)該被忽略。在 Java 對象序列化期間,對象的狀態(tài)被轉(zhuǎn)換為字節(jié)流,以便在網(wǎng)絡(luò)上傳輸或持久保存到磁盤。如果一個字段被標(biāo)記為 transient,那么它的值不會被序列化,在反序列化時會被恢復(fù)其默認(rèn)值。
簡單示例
public class Example implements Serializable {
private String name;
private transient int age;
public Example(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Example{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) throws Exception {
String dir = "/Users/ryan/Desktop/";
// 創(chuàng)建一個Example對象并序列化到文件
Example obj = new Example("Ryan", 20);
System.out.println("Before serialization: " + obj);
OutputStream outputStream = Files.newOutputStream(Paths.get(dir + "example.ser"));
try (ObjectOutputStream out = new ObjectOutputStream(outputStream)) {
out.writeObject(obj);
}
// 從文件中反序列化Example對象
InputStream inputStream = Files.newInputStream(Paths.get(dir + "example.ser"));
try (ObjectInputStream in = new ObjectInputStream(inputStream)) {
System.out.println("After deserialization: " + in.readObject());
}
}
}執(zhí)行結(jié)果:
Before serialization: Example{name='Ryan', age=20}
After deserialization: Example{name='Ryan', age=0}
在上述示例中,我們創(chuàng)建了一個名為 Example 的類,并在其中定義了兩個字段 name 和 age,其中 age 被標(biāo)記為 transient。然后,我們創(chuàng)建了一個 Example 對象并將其序列化到名為 example.ser 的文件中。
接著,我們從文件中反序列化了剛剛序列化的 Example 對象,并將其賦值給一個新的對象 newObj。然后,我們打印出了原始對象和反序列化后的對象??梢钥吹?,在反序列化后,age 字段的值被恢復(fù)為其默認(rèn)值 0。
使用場景
序列化敏感數(shù)據(jù)
有些對象包含一些敏感信息,如密碼、訪問令牌等,這些信息在對象序列化時需要被保護(hù),以防被未授權(quán)的用戶訪問和泄露。
提高序列化性能
有些對象中的字段可能會影響序列化和反序列化的性能,如包含大量數(shù)據(jù)的對象,這些數(shù)據(jù)可能會在網(wǎng)絡(luò)傳輸或磁盤存儲期間增加延遲和負(fù)載,使用 transient 關(guān)鍵字可以排除這些字段,提高序列化性能。
臨時數(shù)據(jù)
有些字段僅用于對象的內(nèi)部計算或臨時存儲數(shù)據(jù),這些數(shù)據(jù)在序列化時無需保留,因此可以使用 transient 關(guān)鍵字來忽略這些字段,從而減少序列化后對象的大小。
需要注意的點
- transient關(guān)鍵字只能修飾變量,而不能修飾方法和類。
- transient標(biāo)記的變量所在的類必須實現(xiàn)Serializable接口。
- transient標(biāo)記的變量在反序列化時會被初始化為默認(rèn)值,需要在程序中手動進(jìn)行初始化操作。
總結(jié)
transient 關(guān)鍵字只是暫時地在序列化過程中忽略了該字段,而不是永久性地從對象中刪除該字段。在反序列化時,該字段將被恢復(fù)為其默認(rèn)值。因此,如果需要永久地從對象中刪除一個字段,直接將其從類中完全刪除。
應(yīng)該很少有人,會在項目中使用這個關(guān)鍵字吧,所以它值得被遺忘
到此這篇關(guān)于被遺忘的Java關(guān)鍵字transient的使用詳解的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字transient內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spring Cache和Redis實現(xiàn)查詢數(shù)據(jù)緩存
在現(xiàn)代應(yīng)用程序中,查詢緩存的使用已經(jīng)變得越來越普遍,它不僅能夠顯著提高系統(tǒng)的性能,還能提升用戶體驗,在這篇文章中,我們將探討緩存的基本概念、重要性以及如何使用Spring Cache和Redis實現(xiàn)查詢數(shù)據(jù)緩存,需要的朋友可以參考下2024-07-07
MybatisPlus:使用SQL保留字(關(guān)鍵字)的操作
這篇文章主要介紹了MybatisPlus:使用SQL保留字(關(guān)鍵字)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
SpringCloud中的OpenFeign調(diào)用解讀
OpenFeign是一個顯示聲明式的WebService客戶端,使用OpenFeign能讓編寫Web Service客戶端更加簡單OpenFeign的設(shè)計宗旨式簡化Java Http客戶端的開發(fā),本文給大家介紹SpringCloud之OpenFeign調(diào)用解讀,感興趣的朋友一起看看吧2023-11-11

