Kotlin lazy default property

En Kotlin, ¿cómo defino una var que tiene un valor por defecto?

por ejemplo, un val sería algo como esto:

 val toolbarColor by lazy {color(R.color.colorPrimary)} 

Lo que quiero hacer es tener un valor pnetworkingeterminado para alguna propiedad ( toolbarColor ), y puedo cambiar ese valor por cualquier otra cosa. ¿Es posible?

EDITAR: Esto hace el truco parcial.

 var toolbarColor = R.color.colorPrimary get() = color(field) set(value){ field = value } 

¿Es posible aliviar esto escribiendo

 var toolbarColor = color(R.color.colorPrimary) set(value){ field = value } 

de una manera que el valor pnetworkingeterminado se calcula de forma perezosa? Por el momento, no funcionará porque color() necesita un Context que solo se inicializa más adelante.

Puedes crear tu propio método delegado:

 private class ColorDelegate<T>(initializer: () -> T) : ReadWriteProperty<Any?, T> { private var initializer: (() -> T)? = initializer private var value: T? = null override fun getValue(thisRef: Any?, property: KProperty<*>): T { return value ?: initializer!!() } override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { this.value = value } } 

Declarar en algún delegado:

 object DelegatesExt { fun <T> lazyColor(initializer: () -> T): ReadWriteProperty<Any?, T> = ColorDelegate(initializer) } 

Y usar de la siguiente manera:

 var toolbarColor by DelegatesExt.lazyColor { // you can have access to your current context here. // return the default color to be used resources.getColor(R.color.your_color) } ... override fun onCreate(savedInstanceState: Bundle?) { // some fun code // toolbarColor at this point will be R.color.your_color // but you can set it a new value toolbarColor = resources.getColor(R.color.new_color) // now toolbarColor has the new value that you provide. } 

Creo que esta podría ser una forma más limpia de hacerlo, pero aún no lo sé (comenzando con kotlin hace unos días). Voy a echar un vistazo y ver si esto se puede hacer con less código.

Puede almacenar su propiedad en un map para crear básicamente un perezoso mutable. Necesita un map mutable (como HashMap<K, V> ) con una function pnetworkingeterminada para delegar a:

 var toolbarColor by hashMapOf<String, Any?>() .withDefault { toolbarColor = R.color.colorPrimary; toolbarColor } 

También deberá importar algunas funciones de extensión: import kotlin.properties.getValue e import kotlin.properties.setValue .

Sería bueno si Kotlin proporcionara algo integrado y optimizado para esto (como un mutableLazy o algo así). Como tal, he creado KT-10451 .

  • Android Kotlin Gson Slow Json Deserialization
  • Cómo get la class de parámetro genérico en Kotlin
  • Cómo agregar la dependencia RecyclerView - gradle 3
  • OnCreateOptionsMenu llamado de class abstracta
  • ¿Cuál es el propósito de una statement de object dentro de una class sellada en Kotlin?
  • ¿Cómo puedo usar un método Java String (split) directamente desde la fuente de Kotlin?
  • solo se permiten classs en el lado izquierdo de un literal de class al usar Mockito y kotlin
  • ¿Cómo crear proxy dynamic / transparente en Kotlin?
  • Dagger no puede inyectarse con Kotlin
  • Kotlin y Spark: problemas de SAM
  • Enfoque correcto para la class de Kotlin inyectada de constructor inmutable