کلاس Singleton  در کاتلین
کلاس Singleton در کاتلین

اگه بخوام که کلاس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) { ... }
}

 

ممنون که با یکی دیگر از آموش های باگتو با ما همراه بودید امیدوارم که این آموزش مانند آموزش های قبلی مفید واقع شده باشد.

سوالات و مشکلات خودتان را می توانید در بخش نظرات برای ما ارسال کنید.

جدیدترین ویدئوهای آموزشی

در بخش TV باگتو، آموزش های کوتاه و جدید را مشاهده نمایید

0 نظرات

برای ارسال نظر باید وارد حساب کاربری خود شوید
ورود به حساب کاربری ثبت نام

بیش از 50% تخفیف به مناسبت جمعه سیاه
فقط تا پایان امروز