¿Cuáles son algunas diferencias importantes entre Java y Kotlin?

fuente: Java vs. Kotlin: ¿Deberías usar Kotlin para el desarrollo de Android?

Puede escribir aplicaciones de Android en cualquier idioma que pueda compilarse y ejecutarse en la Máquina virtual Java (JVM), y sus usuarios finales no serán más sabios. Y un lenguaje de programación compatible con JVM que realmente llamó la atención de la comunidad de Android es Kotlin, un lenguaje de programación estáticamente tipado de JetBrains.

Si ha escuchado cosas buenas sobre Kotlin y está interesado en probarlo usted mismo, entonces está en el lugar correcto. En esta serie de tres partes, voy a compartir todo lo que necesita saber para comenzar a usar Kotlin para el desarrollo de Android.

En esta primera entrega, veré por qué usted, como desarrollador de Android, podría considerar hacer el cambio de Java en primer lugar, y luego examinaré los pros y los contras de seleccionar Kotlin como su reemplazo de Java. Al final de este artículo, tendrá una sólida comprensión de lo que Kotlin tiene para ofrecer y sabrá si es adecuado para usted.

En la segunda parte, veremos cómo configurar su instalación de Android Studio para que sea compatible con Kotlin y crear una aplicación de Android simple que esté escrita completamente en Kotlin. Con estos fundamentos en su lugar, en la tercera entrega veremos cómo potenciar su desarrollo de Android, utilizando algunas características más avanzadas del lenguaje Kotlin.

¿Por qué debería hacer el cambio desde Java?

Si bien Java es uno de los lenguajes de programación más utilizados en el mundo y es prácticamente el idioma oficial de desarrollo de Android, existen muchas razones por las cuales Java no siempre es la mejor opción para sus proyectos de Android.

El mayor problema es que Java no es un lenguaje moderno, y aunque Java 8 fue un gran paso adelante para la plataforma, introdujo muchas características que los desarrolladores habían estado esperando (incluidas las funciones lambda), al momento de escribir Android solo es compatible Un subconjunto de características de Java 8. Parece poco probable que los desarrolladores de Android obtengan todos los beneficios de Java 8 en el corto plazo, por lo que en el futuro previsible si desea utilizar Java en sus proyectos de Android, entonces está bastante atrapado con Java 7.

Java en su conjunto también tiene algunos problemas de lenguaje bastante bien documentados, que incluyen bloques de try interminable, falta de capacidad de ampliación, inseguridad nula (y esa infame NullPointerException ), sin mencionar la falta de soporte para las funciones de programación funcional. Aunque Java está comenzando a agregar algunos elementos de programación funcionales, como las expresiones lambda y las interfaces funcionales, en esencia, Java sigue siendo un lenguaje de procedimiento. La sintaxis de Java también es bastante detallada, especialmente en comparación con muchos lenguajes de programación modernos.

Ventajas de Kotlin

Por lo tanto, es posible que desee considerar cambiar a uno de los muchos lenguajes de programación modernos que están diseñados para ejecutarse en la JVM. Si bien no hay escasez de lenguajes que compilan el código de bytes de Java, hay algunos factores que hacen que Kotlin se destaque entre la multitud:

Intercambiabilidad con Java

Una de las mayores fortalezas de Kotlin como alternativa potencial a Java es el gran nivel de interoperabilidad entre Java y Kotlin: incluso puede tener el código de Java y Kotlin existente uno al lado del otro en el mismo proyecto, y todo se compilará perfectamente. A continuación, puede ver un ejemplo de un proyecto que consta de una Activity Java y una Actividad Kotlin.

De hecho, una vez que se compila su proyecto mixto de Kotlin y Java, los usuarios no podrán saber qué partes de su proyecto están escritas en Java y qué partes están escritas en Kotlin.

Dado que las clases de Kotlin y Java pueden existir una al lado de la otra en el mismo proyecto, puede comenzar a usar Kotlin sin tener que hacer nada drástico como convertir un proyecto completo a Kotlin o comenzar un nuevo proyecto específicamente para que pueda probar suerte en Kotlin.

Gracias a este nivel de interoperabilidad, si tiene un proyecto en el que ya está trabajando, puede probar Kotlin en una pequeña parte de ese proyecto sin afectar el resto de su base de código. Y, si decide que desea continuar usando Kotlin, puede migrar el código Java existente de su proyecto a Kotlin un archivo a la vez, o dejar intacto el código Java heredado de su proyecto y solo usar Kotlin para las nuevas clases y características.

Dado que Kotlin es completamente interoperable con Java, también podrá utilizar la mayoría de las bibliotecas y marcos de Java en sus proyectos de Kotlin, incluso marcos avanzados que dependen del procesamiento de anotaciones.

Curva de aprendizaje fácil

Kotlin pretende ser una mejora para Java, en lugar de una reescritura completa, por lo que muchas de las habilidades que ha adquirido y perfeccionado a lo largo de su carrera en Java aún deberían ser aplicables a sus proyectos de Kotlin.

Kotlin también está diseñado para tener una curva de aprendizaje suave para los desarrolladores de Java. Los desarrolladores de Java deberían descubrir que la mayoría de la sintaxis de Kotlin se siente familiar; Por ejemplo, el código que se utiliza para crear una nueva clase en Kotlin es muy similar a Java:

1 class MainActivity : AppCompatActivity() {

Kotlin también está diseñado para ser intuitivo y fácil de leer, por lo que incluso si encuentra algún código que es drásticamente diferente, aún debería ser capaz de entender lo que está haciendo este código.

Combine lo mejor de la programación funcional y procesal

Actualmente hay una serie de paradigmas de programación que están en uso generalizado, pero cuando se trata de “qué enfoque es el mejor”, no hay una respuesta fácil. Cada paradigma de programación tiene su propio conjunto de fortalezas y debilidades, por lo que si bien no hay escasez de escenarios en los que la programación funcional tiene una ventaja, también hay muchos problemas en los que un enfoque de procedimiento es más efectivo.

Entonces, ¿por qué debería elegir entre funcional y de procedimiento? Al igual que muchos lenguajes de programación modernos, Kotlin tiene como objetivo brindarle lo mejor de ambos mundos mediante la combinación de conceptos y elementos de programación funcional y de procedimientos.

Soporte de primera clase para Android Studio

Kotlin es desarrollado por JetBrains, la compañía detrás de IntelliJ, el IDE en el que se basa Android Studio. No es sorprendente, entonces, que Android Studio tenga un excelente soporte para Kotlin. Una vez que haya instalado el complemento Kotlin, Android Studio hace que la configuración de Kotlin en su proyecto sea tan sencilla como abrir algunos menús.

Una vez que haya configurado el complemento Kotlin para Android Studio, su IDE no tendrá problemas para comprender, compilar y ejecutar el código Kotlin. Android Studio también proporciona depuración, autocompletado, navegación de código, pruebas de unidad y soporte completo de refactorización para Kotlin.

Una vez que su proyecto de Android Studio esté configurado para admitir Kotlin, incluso podrá convertir un archivo fuente Java completo en un archivo Kotlin, con solo unos pocos clics del mouse.

Código más conciso

Si compara una clase Java y una clase Kotlin que producen los mismos resultados, la escrita en Kotlin generalmente será mucho más sucinta y compacta que la escrita en Java. Y como todo desarrollador sabe, ¡menos código significa menos errores!

Por ejemplo, el siguiente código de Java crea una Actividad que consiste en un botón de acción flotante (FAB) que, cuando se toca, muestra una barra que contiene el mensaje útil Esta es una barra de bocadillos .

class public MainActivity extends AppCompatActivity {

@Override

void protected onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

FloatingActionButton myfab = (FloatingActionButton) findViewById(R.id.myfab);

myfab.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Snackbar.make(view, "This is a snackbar", Snackbar.LENGTH_LONG)

.setAction("Action", null).show();

}

});

}

}

El equivalente de Kotlin logra este mismo trabajo en menos código, particularmente cuando se trata de crear el FAB y configurar onClickListener :

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val toolbar = findViewById(R.id.toolbar) as Toolbar

setSupportActionBar(toolbar)

val myfab = findViewById(R.id.myfab) as FloatingActionButton

myfab.setOnClickListener { view ->

Snackbar.make(view, "This is a snackbar", Snackbar.LENGTH_LONG)

.setAction("Action", null).show()

}

}

}

Ambos fragmentos de código tienen exactamente la misma salida:

Kotlin es particularmente bueno para reducir la cantidad de código repetitivo que necesita escribir, lo que debería hacer que la codificación en Kotlin sea una experiencia mucho más agradable, en comparación con la codificación en lenguajes más detallados como Java.

En particular, las extensiones de Android Kotlin (que exploraremos en la segunda parte) le permiten importar la referencia a una Vista en un archivo de Actividad, para que luego pueda trabajar con la Vista como si fuera parte de esa Actividad. Esto significa que ya no tiene que identificar cada Vista usando findViewById , que puede transformar código como:

1 TextView text = (TextView) findViewById(R.id.myTextView); text.setText("Hello World"); TextView text = (TextView) findViewById(R.id.myTextView); text.setText("Hello World");

En lo mucho más sucinto:

1 myTextView.setText("Hello World")

¿Cuál es el truco?

Ningún lenguaje de programación es perfecto, por lo que aunque Kotlin tiene mucho que ofrecer a los desarrolladores de Android, hay algunos inconvenientes que deberá tener en cuenta:

Tamaño extra de tiempo de ejecución

La biblioteca estándar de Kotlin y el tiempo de ejecución aumentarán el tamaño de su .apk . Si bien esto solo equivale a alrededor de 800 KB, si su aplicación ya está en el lado grande, esos 800 KB adicionales pueden volcarlo y hacer que los usuarios piensen dos veces antes de descargar su aplicación.

Legibilidad inicial del código

Aunque la sintaxis concisa de Kotlin es una de las mayores fortalezas del lenguaje, es posible que inicialmente encuentre que Kotlin es difícil de descifrar, simplemente porque hay tantas cosas en una pequeña cantidad de código. Java puede ser más detallado, pero lo bueno es que todo está claramente explicado, lo que significa que el código Java desconocido tiende a ser más fácil de descifrar que Kotlin desconocido.

Además, si se usa incorrectamente, la sobrecarga del operador de Kotlin puede resultar en un código que es difícil de leer.

Falta de apoyo oficial

Kotlin puede tener un excelente soporte en Android Studio, pero vale la pena recordar que Kotlin no cuenta con el respaldo oficial de Google.

Además, la compilación y el autocompletado de Android Studio tienden a funcionar un poco más despacio cuando trabajas con Kotlin, en comparación con un proyecto Java puro.

Comunidad más pequeña y menos ayuda disponible

Dado que Kotlin es un lenguaje relativamente nuevo, la comunidad de Kotlin sigue siendo bastante pequeña, particularmente en comparación con la comunidad que rodea a los idiomas más establecidos como Java. Si cambia a Kotlin, es posible que no tenga acceso a la misma cantidad de tutoriales, publicaciones de blog y documentación del usuario, y puede encontrar menos apoyo de la comunidad en lugares como foros y Stack Overflow. Al momento de escribir este artículo, la búsqueda de Kotlin en Stack Overflow devuelve poco más de 4,600 publicaciones etiquetadas con Kotlin, en comparación con las increíbles 1,000,000+ publicaciones que contienen la etiqueta Java .

Conclusión

En la primera publicación de esta serie de tres partes, analizamos por qué es posible que desee considerar cambiar la parte de Java de su desarrollo de Android a uno de los lenguajes más modernos y compatibles con JVM. También analizamos más de cerca las ventajas y desventajas únicas de Kotlin como un posible reemplazo de Java.

Si ha sopesado los pros y los contras y ha decidido dar una vuelta a Kotlin, en la segunda parte de esta serie, le mostraré cómo usar Android Studio para crear una aplicación simple de Android, escrita completamente en Kotlin . ¡También veremos cómo puedes usar Kotlin para asegurarte de que nunca más tengas que escribir otro findViewById !

Espero que esta información ayude !!

⚔️ Kotlin Vs Java

  • Seguridad Trabajando con nulo . El sistema tipo Kotlin está construido de manera de minimizar la posibilidad de aparición de NullPointerException. Hablaremos de eso en un momento.
  • No hay excepciones marcadas. La eficiencia y la ineficiencia de las excepciones marcadas es un tema de los argumentos interminables. Sin embargo, imponer el procesamiento de errores a menudo puede dar lugar a la aparición del código repetitivo.
  • Tipos de funciones A diferencia de Java, Kotlin tiene la capacidad de pasar una función como parámetro a otra función sin recurrir a las interfaces SAM (Método abstracto único) como Runnable, Callable, etc.
  • Array Invariance. Las matrices en Java son covariantes, mientras que en Kotlin son invariantes. Un simple ejemplo de Java:

Número [] números = nuevo Número [1];
Objeto [] objetos = números;
objetos [0] = “hola”;

Podemos asignar el valor Número [] a la variable Objeto [] debido a la covarianza de las matrices Java. No habrá ningún error durante la compilación, pero aparecerá durante la ejecución.

  • No hay tipos sin procesar. Antes de la aparición de los genéricos en Java, los llamados tipos crudos se usaban ampliamente. Aquí hay un ejemplo problemático:

Lista rawList = new ArrayList ();
rawList.add (nuevo Object ());
List strings = rawList;
System.out.println (strings.get (0));

La nueva clase ArrayList () crea una lista con un tipo sin formato. Una vez más, aparece un error en la ejecución, no compilando.

  • El sistema genérico reelaborado . Los creadores de Kotlin intentaron resolver algunos de los problemas con los genéricos encontrados en Java. Sin embargo, el sistema genérico todavía está, desafortunadamente, trabajando en la etapa de compilación como Java y no en el tiempo de ejecución.

Fortalezas de Kotlin

Las principales ventajas de Kotlin se encuentran donde no hay un equivalente de Java. Esto es lo que pude detectar:

1. Las funciones de orden superior, expresiones lambda y funciones en línea.

Como dije, las funciones de Kotlin ganaron la capacidad de aceptar otras funciones como argumentos. Estas funciones se denominan funciones de orden superior. Además de eso, Kotlin tiene implementado un conveniente sistema de expresiones lambda.

Según los acuerdos de Kotlin:

  • Puede mover u omitir los paréntesis en un método si la lambda está en la última posición o es el único argumento en el método. Por ejemplo, en lugar de clients.filter ({customer -> customer.city == search}), puede escribir customers.filter {customer -> customer.city == search}.
  • Si decidió no declarar un argumento de una lambda de un argumento, se declarará implícitamente bajo su nombre. El ejemplo anterior se puede reescribir así: customers.filter {it.city == search}.

Las expresiones Lambda nos permiten escribir código funcional de manera segura, breve y expresiva:

// Devuelve el producto más caro entre todos los productos entregados
pedidos
.filter {it.isDelivered}
.flatMap {it.products}
.maxBy {it.price}

2. Extensiones

En Kotlin existen las llamadas extensiones que permiten agregar nuevas funciones y propiedades a las clases antiguas sin afectar su código fuente.

diversión String.lastChar () = get (longitud – 1)

“abc” .lastChar ()

Además, en Kotlin puede llamar a una expresión lambda para un objeto receptor específico. Dentro de dicha expresión, puede acceder a los campos y funciones de los objetos sin ningún calificador. Esto nos permite crear los llamados constructores de estilo Groovy de tipo seguro.

html {
cuerpo {
div {
a (” http: //kotlinlang.org&quot 😉 {
target = ATarget.blank
+ “Sitio principal”
}
}
}
}

3. Tipo inteligente de fundición

El compilador de Kotlin rastrea la lógica del código y ejecuta un casting inteligente.

if (obj es String) {
print (obj.length) // obj se convierte automáticamente en String
}

4. Seguridad nula

Como mencioné anteriormente, Kotlin ha implementado la seguridad nula mediante la introducción de la separación de tipo nulable y no nula. Por defecto, los tipos no permiten nulo pero pueden modificarse para hacerlo si agregamos?. Kotlin ejecuta verificaciones forzadas durante la compilación y evita el uso de las variables anulables sin la verificación nula. Por lo tanto, no hay peligro de NullPointerException. Además, no puede asignar nulo a una variable declarada como no anulable.

Un tipo no nulo:

var a: String = “abc”
a = nulo // error de compilación
val l = a.length // se garantiza que no causará un NPE

Acceder a cualquier campo de la función a es seguro porque tiene el tipo no nulo.

Un tipo anulable:

var a: String = “abc”
a = nulo // error de compilación
val l = a.length // se garantiza que no causará un NPE

El compilador de Kotlin no permitirá el acceso directo a los campos de función b, ya que puede ser nulo. Tenemos algunas opciones sobre cómo ejecutar este acceso:

  • Puede verificar el valor antes de acceder. Con esto, después de la comprobación (b! = Null), el tipo b se especificará automáticamente como el tipo de String no nulo:

val l = if (b! = null) b.length else -1

  • Puedes usar el? operador para un acceso seguro:

val l = b? .length

El resultado de esta expresión tiene el Int? escriba y es igual a b.length si b no es nulo o nulo en el caso contrario.

  • Si estamos buscando recibir NullPointerException, podemos usar el !! operador. ¡¡El b!! La expresión restablecerá el tipo de cadena a no nulo si b! = nulo, de lo contrario aparecerá la excepción NullPointerException.

val l = b !!. longitud

Nota: De hecho, la aparición de NullPointerException solo es posible en los siguientes casos:

  • El error se llama intencionalmente: lanzar NullPointerException () o el !! Se utiliza el operador.
  • El NPE aparece en el lado del código Java.
  • El error aparece como resultado del incumplimiento de los datos de inicialización. Por ejemplo, el subinicializado se usa en alguna parte:

clase Foo {
val c: String

en eso {
bar()
c = “”
}

fun bar () = println (c.length) // NPE aquí
}

5. Valores predeterminados de funciones

Una práctica común en Java es sobrecargar métodos y constructores para la implementación de argumentos de valor predeterminado. Kotlin tiene los argumentos predeterminados para eso.

lectura divertida (b: matriz , desactivada: Int = 0, len: Int = tamaño b) {

}

De hecho, los argumentos predeterminados nos permiten deshacernos de casi todos los casos de sobrecarga de métodos y constructores, lo que ayuda a evitar este tipo de código repetitivo.

6. Plantillas de cadena

En Kotlin, las cadenas pueden contener plantillas de cadena, en otras palabras, el código resultante se concatenará en la cadena.

val s = “abc”
val str = “$ s.length is $ {s.length}” // se evalúa como “abc.length is 3”

7. El sistema extendido de propiedades y campos

Las cadenas de Kotlin pueden tener campos y propiedades con funcionalidad extendida, incluidos captadores y establecedores personalizables:

var stringRepresentation: String
get () = this.toString ()
valor ajustado) {
setDataFromString (value) // analiza la cadena y asigna valores a otras propiedades
}

Una de las tareas súper comunes es implementar una propiedad que se concatena una vez en el primer acceso, la llamada ‘propiedad perezosa’. En Kotlin, dicho campo se puede crear fácilmente:

val lazyValue: String by lazy {
println (“calculado!”)
“Hola”
}

Implementado con la ayuda de las propiedades delegadas :

Ejemplo de clase {
var p: Cadena por delegado ()
}

La expresión after by es el delegado que procesa (get () y set ()). El delegado no necesariamente tiene que implementar alguna interfaz de usuario, es suficiente para que tenga los métodos get () y set () con una firma específica.

La biblioteca estándar de Kotlin muestra varios tipos útiles de delegados: propiedades diferidas , propiedades observables y las propiedades almacenadas en un mapa .

8. Inferencia de tipo automatizada

Kotlin tiene la capacidad de realizar inferencia de tipos por sí solo.

val resultado = secuencia de (10) .map {it.toString ()} .flatMap {it.toCharArray (). asSequence ()} .toList ()

También sabe que el resultado de la expresión tiene el tipo de Lista .

9. Singletons a nivel de idioma

Un singleton es un patrón de uso frecuente en la programación. Se puede declarar fácilmente en Kotlin mediante la palabra clave object:

objeto DataProviderManager {
fun registerDataProvider (proveedor: DataProvider) {
// …
}
val allDataProviders: Colección
get () = // …
}

10. Corutinas (coprogramas)

El uso de corutinas nos permite escribir secuencialmente código asíncrono para que la lógica en el código sea síncrona mientras funciona como asíncrono. Dicho esto, un hilo no se bloquea sino que se suspende.

Si tuviera la oportunidad de implementar una secuencia de operaciones asincrónicas, podría estar familiarizado con un término de Callback Hell . Es el fenómeno de las devoluciones de llamada anidadas dentro de otras devoluciones de llamada de varios niveles de profundidad. Cuanto más larga sea la cadena de operaciones asincrónicas, más devoluciones de llamadas anidadas habrá. Esto hace que el código sea ilegible y susceptible de errores. Ingrese las rutinas que ayudan a evitar este problema.

divertido sendEmailAsync () = async (CommonPool) {
val emailTask ​​= async (CommonPool) {
Thread.sleep (500)
[correo electrónico protegido]
}

val messageTask = async (CommonPool) {
Thread.sleep (200)
“El mensaje”
}

sendEmail (emailTask.await (), messageTask.await ())
}

En pocas palabras, las corutinas son una especie de “hilos ligeros” que requieren un esfuerzo mínimo para crear y mantener. Al mismo tiempo, crear hilos nativos es un proceso costoso, por ejemplo:

fun main (args: Array ) = runBlocking {
val jobs = List (100_000) {// crea muchas rutinas y enumera sus trabajos
lanzamiento (CommonPool) {
retraso (1000L)
impresión(“.”)
}
}
jobs.forEach {it.join ()} // espera a que se completen todos los trabajos
}

Este código lanza rutinas de 100K y después de 1 segundo cada una imprime un punto. El código es fácil de iniciar y se ejecuta rápidamente. Volver a representar esto con hilos nativos es bastante problemático.

Coroutines es una potente funcionalidad que nos permite utilizar diferentes enfoques para escribir código competitivo. Puede usar las soluciones estándar de la biblioteca kotlinx.coroutine o implementar la suya propia.

Aquí hay un ejemplo rápido para demostrar el amplio espectro de corutinas con una relativa facilidad de uso. Digamos que tenemos las funciones poco confiables (susceptibles a errores de red) de f1 y f2. Necesitamos obtener la suma de estas funciones llamándolas varias veces con un tiempo de espera predefinido pero sin exceder el número dado de intentos:

suspender diversión f1 (i: Int): Int {
retraso (si (i! = 2) 2000L más 200L)
volver 1
}

suspender diversión f2 (i: Int): Int {
retraso (si (i! = 2) 2000L más 200L)
volver 2
}

diversión en línea reintentar (n: Int, bloque: (Int) -> T): T {
var ex: ¿Lanzable? = nulo
repetir (n) {i ->
intente {return block (i)}
catch (e: Throwable) {
println (“Falló con $ e”)
ex = e
}
}
tirar ex !! / * volver a lanzar el último fallo * /
}

fun asyncRetry (n: Int, tiempo: Long, bloque: suspender (Int) -> T) =
asíncrono (CommonPool) {
reintentar (n) {i ->
withTimeout (tiempo) {
bloque (i)
}
}
}

suspender diversión coroutineExample () {
val retryCount = 3
tiempo de espera val = 500
val v1 = asyncRetry (retryCount, timeout) {i -> f1 (i)}
val v2 = asyncRetry (retryCount, timeout) {i -> f2 (i)}
println (r1.await () + r2.await ())
}

Completar una tarea similar en Java habría requerido escribir mucho más código. Quizás RxJava podría haber ayudado un poco, pero apenas puede proporcionar la misma simplicidad y legibilidad.

Kotlin

Cuestiones

Matices

En aras de la integridad, tengo ganas de tirar un par de problemas que encontré en mi experimento del proyecto Kotlin. Debería decir no problemas, sino los matices del uso del lenguaje.

Autoconversión de código Java

Android Studio, así como IntelliJ IDEA, permiten la conversión automática de código Java a Kotlin, incluidos todos los archivos y fragmentos en copiar / pegar. La conversión funciona bastante bien, sin embargo, el código convertido aún requiere una verificación. En mi caso, algunas constantes de cadena se perdieron durante la conversión.

Tipo de fundición

Kotlin es extremadamente estricto cuando se trata de lanzar. El siguiente código no se compilará:

var longValue = 1L

if (longValue == 0) println (“zero”) // error en tiempo de compilación

No podremos comparar la variable Long con el valor Int de 0. Tenemos que compararlo con el valor Long de 0L. Sin embargo, el compilador permite esta comparación (al menos la versión 1.1 lo hace):

if (longValue> 0) println (“positivo”)

Inconsistencia en su máxima expresión ‍♂️

El var Variables Uso Rigor

El compilador es riguroso al acceder a las variables mutables, esperando que la variable se use en un contexto multiproceso. Un ejemplo exagerado:

valor var: cadena? = nulo

fun foo (): Int {
if (valor! = nulo) {
println (“La longitud es: $ {value.length}”) // ошибка компиляции
}
}

El compilador arroja un error: la conversión inteligente a ‘String’ es imposible, porque ‘value’ es una propiedad mutable que podría haber sido modificada en este momento .

En este caso, es mejor escribir:

valor? .let {
println (“La longitud es: $ {it.length}”)
}

El modificado para bucle

El C y Java familiar para la construcción de las acciones en bucle se modificó en Kotlin:

para (paso en 0..10) println (paso)

Esto significa que la construcción solo funciona con iteradores. En este caso, 0..10 es un rango que tiene un iterador.

  • Tiempo de compilación nulo-seguridad. Las variables, las propiedades, los parámetros y los tipos de retorno deben declararse explícitamente como anulables y deben manejarse valores potencialmente nulos.
  • Esto tiene el beneficio adicional de hacer que los tipos anulables sean una versión de Optional compatible con versiones anteriores sin ninguno de los gastos generales sintácticos o de tiempo de ejecución encontrados en Java o Scala. .
  • Funciones de primera clase que no tienen que ser declaradas en una clase.
  • Lambdas con algunas características superiores a las de Java 8, como la capacidad de declarar un receptor.
  • Corutinas para una multitarea muy eficiente.
  • Tipos de valores declarativos simples sin necesidad de implementadores getterplate, setters, equals y hash necesarios en Java.
  • Inferencia de tipos y tipificación de flujo, por lo que no necesita la excesiva especificación excesiva de la información de tipo típica en Java y muy rara vez necesita convertir tipos.
  • Un enfoque en la inmutabilidad por defecto para que las declaraciones variables y los tipos de colección sean inmutables a menos que se especifique lo contrario
  • Funciones de extensión con alcance que proporcionan una alternativa mucho más ordenada a los métodos de utilidad estática y también permiten DSLs realmente seguros de tipo impresionante (vea la biblioteca de prueba de Spek, por ejemplo).
  • Cuerdas templadas.
  • Argumentos de método predeterminados y argumentos de método con nombre.
  • Genéricos reified sobre métodos (¿alguna vez quisiste poder referirme al tipo de tiempo de ejecución de un genérico?)

“Y mientras estamos agregando Kotlin como idioma oficial de Android, también estamos ampliando nuestra inversión en nuestros idiomas existentes”. – Kotlin y Android

No es el idioma oficial, se ha convertido en uno de los oficialmente compatibles (C ++, JAVA).

Kotlin es casi como Swift. Se reduce la verbosidad de Java y las referencias nulas están controladas por el sistema de tipos, entre muchas ventajas.

Comparación con Java: lenguaje de programación Kotlin

¡Hola! ¿Leíste este artículo? También se describe la diferencia entre Java y Kotlin en palabras simples que incluso yo, como niña rubia, puedo entender))

¡Mejor!