Cómo crear una clase Singleton en Kotlin para Android


Patrón de diseño Singleton, crear una instancia única. Este patrón de diseño sirve para crear una sola instancia de una clase, es decir que al tener un objeto creado se obtiene su instancia para su uso único y exclusivo, normalmente sirve para la carga de base de datos, repositorios etc…

Propiedades de la clase Singleton

Las siguientes son las propiedades de una clase singleton típica:

  • Solo una instancia: la clase singleton tiene solo una instancia y esto se realiza proporcionando una instancia de la clase, dentro de la clase. Además, las clases externas y las subclases deben evitarse para crear la instancia.
  • Accesible globalmente: la instancia de la clase singleton debe ser accesible globalmente para que cada clase pueda usarla.

Singleton

public 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;
    }

}

Su uso

val mSingleton = Singleton.getInstance()

Singleton con parametros

Es posible crear una clase que implemente la lógica de singleton permitiendo paso de parametros en su instancia.

SingletonHolder.kt

open class SingletonHolder<out T, in A>(private val constructor: (A) -> T) {

    @Volatile
    private var instance: T? = null

    fun getInstance(arg: A): T {
        return when {
            instance != null -> instance!!
            else -> synchronized(this) {
                if (instance == null) instance = constructor(arg)
                instance!!
            }
        }
    }
}

Su implementación

En cada clase que se requiere que tenga una sola instancia (Singleton) y permita parametros genericos.

class MyManager private constructor(context: Context) {

    fun doSomething() {
        ...
    }

    companion object : SingletonHolder<MyManager, Context>(::MyManager)
}

Su uso

MyManager.getInstance(context).doSomething()

Recursos

Anuncio publicitario

Publicado por Codelaby

Mobile DevDesigner

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: