Lo primero que necesitarás hacer cuando empieces a programar en Kotlin es crear un nuevo archivo. Las extensiones en Kotlin son .kt. La estructura de código de Kotlin facilita su lectura ya que a diferencia de Java podemos tener varias clases en un mismo archivo o funciones fuera de las clases.

Recordando lo que mencionamos en Estructura del Código, no tiene que haber siempre una estrecha relación entre el nombre del archivo y el nombre de la clase, ya que un archivo puede contener varias clases (aunque todas cortas y muy relacionadas entre si para mantener un código limpio de fácil lectura). Es por esto que el nombre no tiene que estar ligado a una clase en dichas ocasiones y sería más bien una descripción de la relación de esas clases.

Ejemplo

Desde una API obtenemos un objeto pequeño el cual aparte de tener una serie de propiedades tiene otros dos objetos pequeños en su interior, podríamos declarar todos los objetos en un mismo archivo en Kotlin ya que además de estar relacionados, se verían en su totalidad por lo que la estructura del código sería simple y legible.

Supongamos que una API nos da un json el cual es un objeto Movie que a su vez contiene dos objetos, Name y Genre y estos tienen dos strings para cada idioma.

Json

{
  "name": {
    "english": "The Lord of the Rings",
    "spanish": "El Señor de los Anillos"
  },
  "genre": {
    "english": "Fantasy",
    "spanish": "Fantasía"
  }
}

Java

Vamos a ver como quedaría en Java la clase Main:

public class Main {
    public static void main(String[] args) {
        Name name = new Name("The Lord of the Rings", "El Señor de los Anillos");
        Genre genre = new Genre("Fantasy", "Fantasía");
        Movie movie = new Movie(name, genre);

        System.out.println(String.format("Names: %s | %s", movie.getName().getEnglish(), movie.getName().getSpanish()));
        System.out.println(String.format("Genre: %s | %s", movie.getGenre().getEnglish(), movie.getGenre().getSpanish()));
    }
}

Vamos a ver como quedarían los las clases de los Movie, Name y Genre suponiendo que los pusieramos en un mismo archivo:

public class Movie {
    private Name name;
    private Genre genre;

    Movie(Name name, Genre genre) {
        this.name = name;
        this.genre = genre;
    }

    Name getName() {
        return name;
    }

    public void setName(Name name) {
        this.name = name;
    }

    Genre getGenre() {
        return genre;
    }

    public void setGenre(Genre genre) {
        this.genre = genre;
    }
}

class Name {
    private String english;
    private String spanish;

    Name(String english, String spanish) {
        this.english = english;
        this.spanish = spanish;
    }

    String getEnglish() {
        return english;
    }

    public void setEnglish(String english) {
        this.english = english;
    }

    String getSpanish() {
        return spanish;
    }

    public void setSpanish(String spanish) {
        this.spanish = spanish;
    }
}

class Genre {
    private String english;
    private String spanish;

    Genre(String english, String spanish) {
        this.english = english;
        this.spanish = spanish;
    }

    String getEnglish() {
        return english;
    }

    public void setEnglish(String english) {
        this.english = english;
    }

    String getSpanish() {
        return spanish;
    }

    public void setSpanish(String spanish) {
        this.spanish = spanish;
    }
}

Como hemos visto, para algo tan simple tenemos un “tochazo” considerable. Además de que lo normal en la estructura del código de Java es utilizar cada clase en archivos diferentes ya que sino no podríamos colocar ese archivo con todas las clases en otro paquete diferente a donde está Main porque no funcionaría.

Kotlin

Como quedaría todo esto con Kotlin:

Aunque lo normal no va a ser usar la función main() con las data class en el mismo archivo y simplemente ha sido para demostrar lo compacto que sería todo, lo que hubiésemos hecho es tener dos archivos, el Main.kt con la función principal y otro que sería Movie.kt con 3 líneas que incluyen todo el objeto Movie con sus dos objetos internos Name y Genre los cuales están estrechamente relacionados, facilitando su lectura sin tener que buscar cada uno de los archivos como haríamos en Java. Y no solo eso, no ha hecho falta ni crear personalmente el clásico constructor como se haría en java ni los getters/setters ya que todo eso lo conseguimos con el constructor primario además de otras funciones como por ejemplo la función toString() entre otras. La estructura del código en Java quedaría mucho menos leíble y mucho más tosca que en Kotlin.


Enlaces de interés:

Menú