java中transient關(guān)鍵字用法分析
本文實(shí)例分析了java中transient關(guān)鍵字用法。分享給大家供大家參考。具體分析如下:
java有個特點(diǎn)就是序列化,簡單地來說就是可以將這個類存儲在物理空間(當(dāng)然還是以文件的形式存在),那么當(dāng)你從本地還原這個文件時,你可以將它轉(zhuǎn)換為它本身。這可以極大地方便網(wǎng)絡(luò)上的一些操作,但同時,因?yàn)樯婕暗桨踩珕栴},所以并不希望把類里面所有的東西都能存儲(因?yàn)槟菢?,別人可以通過序列化知道類里面的內(nèi)容),那么我們就可以用上transient這個關(guān)鍵字,它的意思是臨時的,即不會隨類一起序列化到本地,所以當(dāng)還原后,這個關(guān)鍵字定義的變量也就不再存在。
通常,我們寫的程序都要求特定信息能持久存在或保存到磁盤上,以供一個程序使用或用在同一個程序的另一次運(yùn)行上.這種持久性可以通過幾種方式來實(shí)現(xiàn),包括寫到數(shù)據(jù)庫中或是利用JAVA為對象序列化提供的支持.不管我們選用什么方法,類實(shí)例的持久性都是通過保存類的域的狀態(tài)來完成的,保存這些狀態(tài),以便以后可以對它們進(jìn)行訪問或使用它們來創(chuàng)建相同的實(shí)例.然而,有可能并不是所有的域都需要被保存起來.當(dāng)一個實(shí)例被持久化時,其內(nèi)部的一些域卻不需要持久化,則可以用trainsient修飾符告訴編譯器指定的域不需要被持久保存.
首先,讓我們看一些Java serialization的代碼:
public class LoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
LoggingInfo(String user, String password)
{
uid = user;
pwd = password;
}
public String toString()
{
String password=null;
if(pwd == null)
{
password = "NOT SET";
}
else
{
password = pwd;
}
return "logon info: /n " + "user: " + uid +
"/n logging date : " + loggingDate.toString() +
"/n password: " + password;
}
}
現(xiàn)在我們創(chuàng)建一個這個類的實(shí)例,并且串行化(serialize)它 ,然后將這個串行化對象寫如磁盤。
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
System.out.println(logInfo.toString());
try
{
ObjectOutputStream o = new ObjectOutputStream(
new FileOutputStream("logInfo.out"));
o.writeObject(logInfo);
o.close();
}
catch(Exception e) {//deal with exception}
To read the object back, we can write
try
{
ObjectInputStream in =new ObjectInputStream(
new FileInputStream("logInfo.out"));
LoggingInfo logInfo = (LoggingInfo)in.readObject();
System.out.println(logInfo.toString());
}
catch(Exception e) {//deal with exception}
如果我們運(yùn)行這段代碼,我們會注意到從磁盤中讀回(read——back (de-serializing))的對象打印password為"NOT SET"。這是當(dāng)我們定義pwd域?yàn)閠ransient時,所期望的正確結(jié)果。
現(xiàn)在,讓我們來看一下粗心對待transient域可能引起的潛在問題。假設(shè)我們修改了類定義,提供給transient域一個默認(rèn)值,代碼如下:
public class GuestLoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
GuestLoggingInfo()
{
uid = "guest";
pwd = "guest";
}
public String toString()
{
//same as above
}
}
現(xiàn)在,如果我們穿行化GuestLoggingInfo的一個實(shí)例,將它寫入磁盤,并且再將它從磁盤中讀出,我們?nèi)匀豢吹阶x回的對象打印password 為 "NOT SET"。
當(dāng)從磁盤中讀出某個類的實(shí)例時,實(shí)際上并不會執(zhí)行這個類的構(gòu)造函數(shù),
而是載入了一個該類對象的持久化狀態(tài),并將這個狀態(tài)賦值給該類的另一個對象。
希望本文所述對大家的Java程序設(shè)計(jì)有所幫助。
相關(guān)文章
IDEA源碼修改器JarEditor使用(反編譯-打包一步到位)
JarEditor是一個IDEA插件,用于修改jar包中的類文件,它允許用戶在不解壓jar包的情況下,直接在IDEA中編輯和修改類文件的源碼,修改完成后,可以一鍵編譯并生成新的jar包,替換原jar包2025-01-01
基于resty orm的ActiveRecord操作數(shù)據(jù)指南
這篇文章主要為大家介紹了基于resty orm的ActiveRecord操作數(shù)據(jù)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
java中如何對arrayList按數(shù)字大小逆序排序
這篇文章主要介紹了java中如何對arrayList按數(shù)字大小逆序排序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04

