در جاوا transient با تلفظ تِرَن زی اِنت یک Non-Access Modifier هست مثل abstract، final، static و .. که قبل از یک متغیر عضو کلاس قرار میگیره و به جاوا میگه هنگام سریالایز این متغیر رو مستثنی کنه (ازینجا میتونید با سریالایز در جاوا آشنا بشید).
به این معنی که در زمان تبدیل مقدار یک آبجکت به جریان بایتها مقدار این متغیر در نظر گرفته نمیشه و زمان دی سریالایز از یک مقدار پیش فرض براش استفاده میشه (معمولا برای نوع دادههای اولیه مقدار پیشفرض صفر یا false هست و برای نوع دادههای دیگه Null).
معمولا اینطور پیش میره که من یک چیز جدید رو توی کدها میبینم میرم داکیومنتش رو میخونم و احتمالا هم متوجه میشم چیه و پایان و احتمالا فراموشی. انقدر داکیومنتی که خوندم تئوری هست که خیلی اوقات باعث نمیشه کاربردش رو درک کنم و وقتی نیاز داشتم بعنوان یک راهحل تو ذهنم بیاد.
در همین مورد اخیر، میگیم اوکی باشه من الان فهمیدم transient چیه و وقتی قبل متغیر بذارنش چه اتفاقی میافته اما به چه درد من میخوره؟ چه مواقعی باید ازش استفاده کنم؟
بیایید یک مثال بزنیم. به آبجکت User فکر کنید و خصوصیاتش مانند نام، نام خانوادگی، ایمیل، آدرس، پسورد و غیره. حالا این آبجکت سریالایز میشه و توی شبکه منتقل میشه. ممکنه یک دغدغه امنیتی برامون پیش بیاد که نمیخوام فیلد پسورد کنار بقیه فیلدهای آبجکت قرار بگیره و ارسال بشه و یک مقدار نگرانم میکنه. اینجاست که علامت گذاری این فیلد با transient میتونه مشکل امنیتی رو حل کنه.
public class User implements Serializable { private String firstName; private String lastName; private String address; private String email; private transient String password; @Override public String toString() { } }
این هم میتونه یک کاربرد دیگه از transient باشه. فرض کنید ما یک کلاس GalleryImage داریم که دو تا فیلد Image و thumbnailImage داره. که فیلد thumbnailImage از روی Image ساخته میشه بهمین خاطر ما میتونیم فیلد thumbnailImage رو transient کنیم و باعث بشیم کدمون efficient بشه.
public class GalleryImage implements Serializable { private static final long serialVersionUID = 123456789L; private Image image; private transient Image thumbnailImage; private void generateThumbnail() { // This method will derive the thumbnail from the main image } private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException { inputStream.defaultReadObject(); generateThumbnail(); } }
نکته مهم
فیلدهای استاتیک بطور غیرمستقیم transient هستند و لازم نیست دوباره transient تعریف بشوند. چرا که فرآیند سریالایز شدن روی نمونهای از کلاس(آبجکتها) اعمال میشه نه خود کلاس ولی فیلدهای استاتیک متعلق به خود کلاس هستند بنابراین قابل سریالایز شدن نیستند.
این سوالیه که شاید تو یه مصاحبه ازتون بپرسن ولی در واقع این دو تا هیچ ربطی به هم ندارن ! تنها ارتباطشون این هست که هردوشون modifier هستند اما transient برای جلوگیری از سریالایز شدن مقدار یک متغیر در پروسه سریالایز شدن یک آبجکت استفاده میشه و volatile به visibility متغیرهایی که توسط تردهای مختلف دستکاری میشن مربوط هست.
برای کلاس ها و متدها استفاده میشه.
این کلمه کلیدی میتونه متغیرها و متدها و کلاس ها رو غیرقابل تغییر کند و برای نگهداری یک مقدار ثابت ازش استفاده میشه.
فقط برای متدها استفاده میشه و نشون میده که اون متد با JNI (Java Native Interface) پیاده سازی شده است.
برای متدها و متغیرهایی استفاده میشه که میخوایم بدون ساخت آبجکت از کلاس بهشون دسترسی داشته باشیم.
یک کلمه کلیدی در جاوا است که برای محدود کردن محاسبات ممیز شناور و حصول اطمینان از نتیجه یکسان در هر پلتفرم در حین انجام عملیات در متغیر ممیز شناور استفاده می شود. البته الان در برنامه نویسی جاوا این کلمه کلیدی بی استفاده هست.
در دنیای چندنخی یا مالتی تردینگ، چند ترد همزمان تلاش میکنن که به یک منبع اشتراکی دست پیدا کنن و نتایج ناسازگاری ایجاد کنند. Synchronization یا همزمانی برای ارتباطات قابل اعتماد در مالتی تردینگ لازم است.
مفهومی برای visibility متغیرهاست. بدون volatile یک متغیر رو ممکنه تردهای مختلف بصورت آپدیت نشده ببینند اما با استفاده از این مودیفایر تردها بعد از اتمام عملیات نوشتن در حافظه مقدار متغیر را خواهند دید.
وقتی دادههای حساسی در آبجکت دارید که نمیخواهید transmit بشه یا یک فیلد میتونه از فیلد دیگه استخراج بشه از transient استفاده کنید.