Función de extensión Kotlin en propiedad mutable

Estoy tratando de establecer una function de extensión en una propiedad mutable para poder reasignar la propiedad en la function de extensión. Quería saber si era posible.

Mis objectives es hacer extensiones de Date para un fácil acceso. Por ejemplo:

 fun Date.addDays(nrOfDays: Int): Date { val cal = Calendar.getInstance() cal.time = this cal.add(Calendar.DAY_OF_YEAR, nrOfDays) return cal.time } 

Esta function agrega el número de días a una date usando un object de Calendar . El problema es que cada vez que tengo que devolver una nueva date puede ser confuso reasignar cada vez que utiliza esta function.

Lo que he intentado:

 fun KMutableProperty0<Date>.addDays(nrOfDays: Int) { val cal = Calendar.getInstance() cal.time = this.get() cal.add(Calendar.DAY_OF_YEAR, nrOfDays) this.set(cal.time) } 

Lamentablemente, esto no se puede usar en un object Date .

¿Es posible hacer esto?

Desafortunadamente, no puede definir una extensión en una propiedad miembro y llamarla con fluidez en Kotlin 1.0.3.

Su extensión se puede reescribir para que funcione de la siguiente manera:

 fun <T> KMutableProperty1<T, Date>.addDays(receiver: T, nrOfDays: Int) { val cal = Calendar.getInstance() cal.time = this.get(receiver) cal.add(Calendar.DAY_OF_YEAR, nrOfDays) this.set(receiver, cal.time) } 

con el siguiente uso:

 class C(var date: Date) { ... } val c = C(someDate()) C::date.addDays(c, 123) 

Con references obligatorias encuadernadas (probablemente compatibles con Kotlin 1.1), esto será posible con la siguiente syntax:

 c::date.addDays(123) 

Como lo sugiere @ MarcinKoziński, también puedes mutar tus objects Date sin reasignar la propiedad:

 fun Date.addDays(nrOfDays: Int) { val cal = Calendar.getInstance() cal.time = this cal.add(Calendar.DAY_OF_YEAR, nrOfDays) this.time = cal.timeInMillis } 

con uso:

 class C(var date: Date) val c = C(someDate()) c.date.addDays(123) 

Con esta solución, debe controlar las references al object Date que está mutado. Esta solución funciona bien con objects mutables, aunque no es adecuada para una propiedad que almacena inmutables.

En lugar de devolver una nueva Date e intentar actualizar su propiedad, puede simplemente modificar la Date que su propiedad ya posee:

 fun Date.addDays(nrOfDays: Int) { val cal = Calendar.getInstance() cal.time = this cal.add(Calendar.DAY_OF_YEAR, nrOfDays) this.time = cal.timeInMillis } 
  • Kotlin delegar propiedad por perezoso que es hilo local
  • En TornadoFX, ¿cómo puedo hacer que una propiedad cambie cuando cambian otras properties?
  • Propiedad observable que permite agregar observadores en time de ejecución
  • Propiedad protegida abstracta Kotlin
  • En TornadoFX, ¿cómo puedo vincular las properties de BigDecimal a otra propiedad de BigDecimal usando objectBinding?
  • Delegado de propiedad de acceso en Kotlin
  • ¿Por qué el código que inicializa una propiedad de interfaz variable no se codificará en la compilation del bloque init?
  • Kotlin: ¿cómo hacer una propiedad delegada por map con un nombre personalizado?
  • ¿Cómo implementar una propiedad que proviene de una fuente determinada hasta que se establece directamente en Kotlin?
  • Convierta variables estáticas de Java a Kotlin
  • Kotlin: ¿Cómo puedo get la class de delegación de una propiedad miembro?