فرشته ناجی
فرشته ناجی
خواندن ۴ دقیقه·۲ سال پیش

مودیفایر transient چی هست و چه کاربردی داره؟

در جاوا 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 تعریف بشوند. چرا که فرآیند سریالایز شدن روی نمونه‌ای از کلاس(آبجکت‌ها) اعمال میشه نه خود کلاس‌ ولی فیلدهای استاتیک متعلق به خود کلاس هستند بنابراین قابل سریالایز شدن نیستند.



تفاوت transient با volatile

این سوالیه که شاید تو یه مصاحبه ازتون بپرسن ولی در واقع این دو تا هیچ ربطی به هم ندارن ! تنها ارتباطشون این هست که هردوشون modifier هستند اما transient برای جلوگیری از سریالایز شدن مقدار یک متغیر در پروسه سریالایز شدن یک آبجکت استفاده می‌شه و volatile به visibility متغیرهایی که توسط تردهای مختلف دستکاری میشن مربوط هست.


بقیه Non-Access Modifierها چی هستند؟

  • مودیفایر Abstract

برای کلاس ها و متدها استفاده می‌شه.

  • مودیفایر final

این کلمه کلیدی میتونه متغیرها و متدها و کلاس ها رو غیرقابل تغییر کند و برای نگهداری یک مقدار ثابت ازش استفاده می‌شه.

  • مودیفایر native

فقط برای متدها استفاده می‌شه و نشون میده که اون متد با JNI (Java Native Interface) پیاده سازی شده است.

  • مودیفایر static

برای متدها و متغیرهایی استفاده می‌شه که میخوایم بدون ساخت آبجکت از کلاس بهشون دسترسی داشته باشیم.

  • مودیفایر strictfp

یک کلمه کلیدی در جاوا است که برای محدود کردن محاسبات ممیز شناور و حصول اطمینان از نتیجه یکسان در هر پلتفرم در حین انجام عملیات در متغیر ممیز شناور استفاده می شود. البته الان در برنامه نویسی جاوا این کلمه کلیدی بی استفاده هست.

  • مودیفایر synchronized

در دنیای چندنخی یا مالتی تردینگ، چند ترد همزمان تلاش میکنن که به یک منبع اشتراکی دست پیدا کنن و نتایج ناسازگاری ایجاد کنند. Synchronization یا همزمانی برای ارتباطات قابل اعتماد در مالتی تردینگ لازم است.

  • مودیفایر volatile

مفهومی برای visibility متغیرهاست. بدون volatile یک متغیر رو ممکنه تردهای مختلف بصورت آپدیت نشده ببینند اما با استفاده از این مودیفایر تردها بعد از اتمام عملیات نوشتن در حافظه مقدار متغیر را خواهند دید.



نکته آخر

وقتی داده‌های حساسی در آبجکت دارید که نمی‌خواهید transmit بشه یا یک فیلد میتونه از فیلد دیگه استخراج بشه از transient استفاده کنید.


Transientaccess modifiersاندروید
برنامه نویس اندروید @NeshanMap
شاید از این پست‌ها خوشتان بیاید