99 votes

Classe singleton en Kotlin

Je veux savoir comment créer une classe singleton en Kotlin, afin que ma classe Util ne l'instancie qu'une seule fois par exécution de l'application. Cependant, lorsque j'ai converti ma classe Java en Kotlin, le code ci-dessous a été généré.

Est-ce correct ?

companion object {
    private var utilProject: UtilProject? = null

    val instance: UtilProject
        get() {
            if (utilProject == null) utilProject = UtilProject()
            return utilProject!!
        }
} 

Je pourrais trouver un lien question mais c'est avec des paramètres, et je n'arrive pas à le convertir sans paramètres.

3voto

Harpreet Points 894

Ceci va vous aider. J'utilise Dialog mais vous pouvez utiliser l'exemple pour avoir une idée de la façon de l'implémenter.

class MyClass(context: Context) : Dialog(context) {
    companion object {
    lateinit var INSTANCE: MyClass

    @JvmStatic
    fun getInstance(context: Context): MyClass{
        if (!::INSTANCE.isInitialized) {
            INSTANCE = MyClass(context)
        }

        return INSTANCE
    }
}}

2voto

Abhishek Rana Points 191

A Singleton exemple sur la mise à jour pour supporter l'appel api.

object RetrofitClient {

    private var instance: Api? = null
    private val BASE_URL = "https://jsonplaceholder.typicode.com/"

    fun getInstance(): Api? {
        if (instance == null) {
            val retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
            instance = retrofit.create(Api::class.java)
        }
        return instance
    }
}

2voto

Joyal C Joseph Points 126
 class TestMySingleton private constructor() {

   companion object {
        var single = TestMySingleton()

        fun getInstance(): TestMySingleton {
            if (single == null)
                single = TestMySingleton()
            return single
        }
    }

}

2voto

Fury Safik Points 1

Variante avec paramètres

open class SingletonHolder<out T: Any, in A>(creator: (A) -> T) {
    private var creator: ((A) -> T)? = creator
    @Volatile private var instance: T? = null

    fun getInstance(arg: A): T {
        val checkInstance = instance
        if (checkInstance != null) {
            return checkInstance
        }

        return synchronized(this) {
            val checkInstanceAgain = instance
            if (checkInstanceAgain != null) {
                checkInstanceAgain
            } else {
                val created = creator!!(arg)
                instance = created
                creator = null
                created
            }
        }
    }
}

1voto

Abhishek Dhyani Points 150
class MyClass {

    init {
        println("init is called")
    }

    companion object {

        private var obj: MyClass? = null
        fun getInstance(): MyClass {
            if (obj == null) {
                obj = MyClass()
            }
            return obj as MyClass 
        }

    }

    fun printHello() {
        println("Hello World")
    }

Vous pouvez créer son instance en MyClass.getInstance() quelque chose comme java

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X