کلاس 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) { ... }
    }
    
    

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

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

    اطلاعات نویسنده
    • نویسنده: میثم بابائی

    ارسال دیدگاه

    برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربری‌تان شوید


    دیدگاه کاربران