sharedinstance - singleton kotlin context
Singleton con argumento en Kotlin (4)
Dado que los objetos no tienen constructores, he hecho lo siguiente para inyectar los valores en una configuración inicial. Puede llamar a la función como desee y puede ser llamada en cualquier momento para modificar el valor (o reconstruir el singleton según sus necesidades).
object Singleton {
private var myData: String = ""
fun init(data: String) {
myData = data
}
fun singletonDemo() {
System.out.println("Singleton Data: ${myData}")
}
}
La referencia de Kotlin dice que puedo crear un singleton usando la palabra clave del objeto así:
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
//
}
}
Sin embargo, me gustaría pasar un argumento a ese objeto. Por ejemplo un ApplicationContext en un proyecto de Android.
¿Hay alguna forma de hacer esto?
Kotlin tiene una función llamada Sobrecarga del operador , que le permite pasar argumentos directamente a un objeto.
object DataProviderManager {
fun registerDataProvider(provider: String) {
//
}
operator fun invoke(context: ApplicationContext): DataProviderManager {
//...
return this
}
}
//...
val myManager: DataProviderManager = DataProviderManager(someContext)
Le recomiendo que use este formulario para pasar argumentos en un siglot en débito de kotlin para que el objeto de su constructor esté privado y bloqueado:
object Singleton {
fun instance(context: Context): Singleton {
return this
}
fun SaveData() {}
}
Y lo llamas así en la actividad.
Singleton.instance(this).SaveData()
También hay dos bibliotecas de inyección de Kotlin nativas que son bastante fáciles de usar y tienen otras formas de singletons, incluidas por hilo, basadas en clave, etc. No estoy seguro si está en el contexto de su pregunta, pero aquí hay enlaces a ambos:
- Injekt (mío, soy el autor): https://github.com/kohesive/injekt
- Kodein (similar a Injekt): https://github.com/SalomonBrys/Kodein
En general, en Android, las personas utilizan una biblioteca como esta, o Dagger, et al., Para realizar la parametrización de singletons, su alcance, etc.