Establecer el valor de un campo sin llamar al método set – Kotlin

He estado usando Kotlin para desarrollar algunas aplicaciones en Android y lo que quiero hacer actualmente es establecer un valor de campo dentro de la class de definición sin llamar al método setter.

Aquí está el código dentro de mi class:

var projectList: List<Project>? = null set(value) { saveProjects(value as ArrayList<Project>) field = value } //GO to the database and retrieve list of projects fun loadProjects(callback: Project.OnProjectsLoadedListener) { database.projectDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe( { success -> callback.onProjectsLoaded(success) //Here i don't want to save the projects, because i've loaded them from the database this.projectList = success }, { error -> GenericErrorHandler.handleError(error,callback.retrieveContext())} ) } 

¿Alguien sabe una forma de hacer esto sin llamar al método set(value) ?

Solo puede get acceso al campo directamente desde el colocador. Dentro de un setter, se puede acceder al field través de la variable de field invisible.

Sin embargo, tal vez haya otras forms de satisfacer sus necesidades. Aquí hay 2 ejemplos. No tendría que seguirlos exactamente, sino que también podría combinarlos para hacer la solución que desee.

Puede usar otra propiedad de shell para actuar como el colocador de su propiedad real:

 class Example1 { var fieldProperty: Int = 0 var setterPropertyForField: Int get() = fieldProperty set(value) { fieldProperty = value } } 

Podría usar setters como lo haría en Java con un campo JVM y un método set. El @JvmField probablemente no es necesario.

 class Example2 { @JvmField var fieldProperty: Int = 0 fun setField(value: Int) { fieldProperty = value } } 

Probablemente puedas acceder al campo y cambiarlo a través de la reflexión, pero no recomiendo ese enfoque. Eso probablemente solo lleve a problemas.

  • Cómo usar un setter personalizado en el cuerpo constructor de la class Kotlin
  • Tokens inesperados (uso; para separar expresiones en la misma línea)
  • ¿Se puede convertir un campo en una versión no nula de sí mismo?
  • Jackson ready only collections
  • ¿Cómo puedo crear un radiogrupo 2x2?
  • TornadoFX reemplaza el layoutChildren en la región
  • Se esperaba Int, se obtuvo IntProgression en su lugar
  • Protocolo Buffer de soporte gradle para Android Kotlin no funciona?
  • Kotlin: ¿por qué necesito inicializar una var con getter personalizado?
  • incapaz de configurar a Kotlin
  • Kotlin en estudio de Android