محمد صادق مهرافزون
محمد صادق مهرافزون
خواندن ۴ دقیقه·۳ ماه پیش

‏singleton در کاتلین

‏singleton در کاتلین:

در کاتلین، سینگلتون‌ها با استفاده از کلمه کلیدی object ایجاد می‌شوند. این کار تضمین می‌کند که تنها یک نمونه از شیء ایجاد شده و در سراسر برنامه استفاده می‌شود.

‏(Thread Safety) در سینگلتون‌های کاتلین:

‏Thread Safety در سینگلتون‌های کاتلین به این معناست که وقتی یک شیء سینگلتون ایجاد می‌شود، حتی اگر چندین رشته (Thread) همزمان بخواهند به آن دسترسی پیدا کنند، مشکلی پیش نخواهد آمد. کاتلین این فرآیند را به‌طور خودکار مدیریت می‌کند و اطمینان می‌دهد که تنها یک نمونه از سینگلتون در زمان اجرای برنامه ساخته شود، حتی اگر دسترسی همزمان از چندین بخش برنامه صورت بگیرد.

به عبارت دیگر، در زبان‌های برنامه‌نویسی معمولاً وقتی چندین رشته بخواهند به یک منبع مشترک دسترسی داشته باشند، احتمال ایجاد مشکل وجود دارد مگر اینکه خود برنامه‌نویس مکانیزم‌هایی برای جلوگیری از این تداخل پیاده‌سازی کند. اما در کاتلین، برای سینگلتون‌ها نیازی به این کار نیست. کامپایلر به طور خودکار از Thread Safety برای ایجاد و مدیریت سینگلتون‌ها اطمینان حاصل می‌کند، به طوری که فقط یک نمونه از شیء ایجاد و استفاده شود، بدون نگرانی از ایجاد تداخل‌های احتمالی در زمان دسترسی‌های همزمان.

در مثال بالا، شیء سینگلتون به صورت Thread-safe مقداردهی اولیه می‌شود. بلوک init فقط یک بار اجرا خواهد شد، صرف نظر از اینکه چند رشته همزمان در حال تلاش برای دسترسی به شیء سینگلتون باشند. این بدان معناست که حتی اگر چندین رشته بخواهند به طور همزمان به شیء دسترسی پیدا کنند، فرآیند مقداردهی اولیه تنها یک بار انجام می‌شود و تمامی دسترسی‌های بعدی به همان نمونه اولیه هدایت می‌شوند.

‏(Objects) در کاتلین و (Thread Safety):
در کاتلین، یک Object اساساً یک سینگلتون است. ویژگی‌های Thread Safety که برای سینگلتون‌ها توضیح داده شد، به تمامی اشیایی که با استفاده از کلمه کلیدی object در کاتلین تعریف می‌شوند، اعمال می‌شود. این بدان معناست که هر شیء ایجاد شده با کلمه کلیدی object به طور ذاتی Thread Safety است و نیازی به اقدامات اضافی برای اطمینان از Thread Safety وجود ندارد.

تفاوت بین Singleton و Object:

در کاتلین، کلمه کلیدی مستقیمی برای "سینگلتون" وجود ندارد؛ به جای آن، از کلمه کلیدی object برای ایجاد کلاس‌های تک‌نمونه‌ای (Single-instance) استفاده می‌شود که در عمل سینگلتون هستند. بنابراین، یک Object در کاتلین به طور طبیعی سینگلتون است و هر دو اصطلاح "singleton " و "Object" را می‌توان به صورت متناوب در کاتلین استفاده کرد.

یک مثال از Object:

‏Thread Safety در object کاتلین:

همان‌طور که قبلاً ذکر شد، کاتلین اطمینان می‌دهد که شیء ‌ای مانند NetworkManager به صورت Thread Safety مقداردهی اولیه می‌شود. شما می‌توانید با اطمینان از چندین رشته به تابع ()sendRequest فراخوانی انجام دهید، بدون نگرانی از ایجاد چندین نمونه یا مشکلات مربوط به مقداردهی اولیه همزمان.

ایمنی رشته‌ای با مقداردهی اولیه به روش Lazy

اگر نیاز به کنترل بیشتری بر روی مقداردهی اولیه سینگلتون خود دارید، می‌توانید از مکانیزم Lazy در کاتلین استفاده کنید. این ویژگی به شما اجازه می‌دهد تا منطق مقداردهی اولیه را تعریف کرده و اطمینان حاصل کنید که Thread Safety بر اساس نیازهای شما رعایت شود. با استفاده از Lazy، مقداردهی اولیه تنها زمانی انجام می‌شود که برای اولین بار به شیء دسترسی پیدا شود، و کاتلین به صورت خودکار Thread Safety را مدیریت می‌کند.


در این مثال، نمونه‌ی MySingleton به صورت Lazy و به شکل Thread Safety با استفاده از LazyThreadSafetyMode.SYNCHRONIZED مقداردهی اولیه می‌شود. این حالت از Synchronization اطمینان حاصل می‌کند که در صورت دسترسی همزمان از چندین رشته، تنها یک نمونه از MySingleton ایجاد خواهد شد و فرآیند مقداردهی اولیه به صورت Thread Safety مدیریت می‌شود.

این روش ایده‌آل برای زمانی است که می‌خواهید سینگلتون فقط در زمان نیاز مقداردهی اولیه شود و در عین حال Thread Safety را تضمین کنید.


نتیجه‌گیری:

  • سینگلتون‌های کاتلین (که با استفاده از کلمه کلیدی object ایجاد می‌شوند) به‌صورت ذاتی Thread Safety هستند.
  • ‏object کاتلین عملاً سینگلتون محسوب می‌شوند و از همان ویژگی‌های Thread Safety بهره می‌برند.
  • مقداردهی اولیه Lazy می‌تواند برای کنترل بیشتر بر فرآیند ایجاد و مقداردهی استفاده شود و Thread Safety را در مواقع مورد نیاز تضمین کند.

طراحی کاتلین ایجاد سینگلتون‌ها و object‏ های Thread Safety‏ را ساده کرده و پیچیدگی و خطاهای احتمالی مرتبط با synchronization را کاهش می‌دهد.


ممنون که تا آخر این پست همراه من بودید ، امیدوارم براتون مفید بوده باشه 🙌🙏✌ (:

بقیه آموزش های من با نام (mister developer) را می توانید در تلگرام و اینستاگرام دنبال کنید!!

کانال تلگرام: mister_developerr

اینستاگرام: mister_developerr

موفق و پیروز باشید



کاتلینsingletonkotlinبرنامه نویسی
شاید از این پست‌ها خوشتان بیاید