sábado, 19 de agosto de 2017

KOTLIN. Property , esa cosa que no es un field.


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.0   
    fun 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

Android y Git. Disponer del hash automáticamente.

Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...