اگه بخوام که کلاس Singleton رو برایتان تعریف کنم اینگونه میگویم:
Singleton یک الگوی طراحی نرم افزار است که تضمین می کند یک کلاس فقط یک نمونه داشته باشد و یک نقطه دسترسی global به آن کلاس توسط آن کلاس فراهم شود. الگوی Singleton تضمین می کند که فقط یک نمونه ایجاد می شود و می تواند به عنوان یک نقطه دسترسی بهش دسترسی داشته باشد و از این طریق از ایمنی موضوع اطمینان حاصل شود.
در کد جاوا ، اینگونه خواهد بود:
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
اما کدهای بالا خطرناک است ، به ویژه اگر در موضوعات مختلف استفاده شود اگر دو thread به طور همزمان به این singleton دسترسی پیدا کنند ، می توان دو نمونه از این شی تولید کرد.
class Singleton {
private static Singleton instance = null;
private Singleton() {
}
private synchronized static void createInstance() {
if (instance == null) {
instance = new Singleton();
}
}
public static Singleton getInstance() {
if (instance == null) createInstance();
return instance;
}
}
synchronized keyword اطمینان می دهد که هیچگونه دخالت نخی در هنگام ایجاد نمونه وجود ندارد.
اگر می خواهید این کار را در Kotlin انجام بدهید ، کد به صورت زیر خواهد بود:
class Singleton private constructor() {
private object HOLDER {
val INSTANCE = Singleton()
}
companion object {
val instance: Singleton by lazy { HOLDER.INSTANCE }
}
}
در این حالت ، توسط { }lazy نشان می دهد که فقط در اولین دسترسی محاسبه می شود
ارزیابی lazy properties همگام سازی شده است، مقدار فقط در یک رشته محاسبه می شود و همه thread ها یک مقدار را مشاهده می کنند.
کاتلین اجرای پیش فرض مورد نیاز بالا را دارد.
object Singleton
بله !!! . فقط یک خط کد وجود دارد و می توانید از آن خطوط کد جلوگیری کنید. یک شی فقط یک نوع داده با یک thread-safe singleton پیاده سازی میکند.
Object declarations
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ...
}
val allDataProviders: Collection<DataProvider>
get() = // ...
}
درست مثل تعریف یک متغیر,تعریف object صرفا یک عبارت نیست برای مراجعه به شیء ، از نام آن به طور مستقیم استفاده می کنیم.
DataProviderManager.registerDataProvider(...)
Objects ها میتوانند supertypes باشند.
object DefaultListener : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { ... }
override fun mouseEntered(e: MouseEvent) { ... }
}
ممنون که با یکی دیگر از آموش های باگتو با ما همراه بودید امیدوارم که این آموزش مانند آموزش های قبلی مفید واقع شده باشد.
سوالات و مشکلات خودتان را می توانید در بخش نظرات برای ما ارسال کنید.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید