KOTLIN. Property , esa cosa que no es un field.
Haciendo una pausa en la documentación, me pongo a experimental el crear / pasar mis clases de cálculos mecánicos desde Java a Kotlin, y me encuentro que estoy encallado a las primeras de cambio.
Para ello voy a poner la clase muy simplificada en Java , su conversión a Kotlin , y una breve explicación del problema encontrado;
Platform declaration clash: The following declarations have the same JVM signature (getDiametroExterior()D):
public final fun <get-diametroExterior>(): Double
public final fun getDiametroExterior(): Double
La clase en Java ;
public class Pieza {private double diametroExterior;public Pieza(){reset();}public void reset(){setDiametroExterior(0);}public double getDiametroExterior() {return diametroExterior; }public void setDiametroExterior(double diametroExterior) {this.diametroExterior = diametroExterior;}}
Podemos observa que tenemos un field, llamado diametroExterior, y sus getters/setters correspondientes.
Si intentamos convertir esto tal cual a Kotlin, con mentalidad "Javato" ;-)
open class PiezaK {
init {
reset()
}
var diametroExterior: Double = 0.0
fun reset() {
setDiametroExterior(0.0)
}
fun getDiametroExterior(): Double {
return diametroExterior
}
fun setDiametroExterior(diametroExterior: Double) {
this.diametroExterior = diametroExterior
}
}
Es en este caso cuando nos dará el mensaje "...The following declarations have the same JVM signature..."
¿ Pero donde está el problema ?
Bueno, una manera rápida de solucionarlo sería hacer lo siguiente, declarar la variable como private. De esta manera solucionamos la conversión de Java a Kotlin.
¿ Es correcto ? NO. ¿ Funciona ? SI, ¿ Entonces donde radica el problema ?
El problema es entender que en Kotlin NO EXISTE los fields de Java.
Esta declaración de Java private double diametroExterior no equivale a var diametroExterior: Double en Kotlin
En Java es un field, en Kotlin es una property,
¿ Y que hace Kotlin automáticamente por nosotros ? Si, los getters/setters.
Por eso, cuando es private funciona para acceder a esa propiedad, pero cuando se indica que es public estamos reescribiendo las funciones que Kotlin hace por nosotros.
Por lo tanto, la transformación correcta sería;
open class PiezaK {init { reset() }var diametroExterior: Double = 0.0fun reset() {diametroExterior = 0}}
Es decir, cuando se declara una property,
var name = "PEPE"
realmente ocurre lo siguiente, el equivalente de esto en Java ;
private String _name = "PEPE";
public String getName() { return _name ; }
public void setName( String name ) { this._name = name }
Se puede ver como existe un campo oculto , en este caso _name , en que si tan siquiera sabe de su existencia.
Vamos, en como toda la vida en Clipper/Harbour con los SETGET :-)
Pero entonces , ¿ como hago mi get/set particular ? Muy fácil, pero lo veremos en otro post.
No hay comentarios:
Publicar un comentario