“Var” en java 10 y kotlin
java variables (3)
Sé que podemos usar la palabra clave "var" para definir variables en Kotlin:
var foo = 3
La última actualización de java (java 10) también introduce el tipo "var":
var bar = new int[]{1, 2, 3}; // int[] bar = {1, 2, 3}
Mi pregunta es, ¿cuál es la diferencia entre el uso de “var” entre estos idiomas?
Su significado es muy diferente, incluso si la sintaxis en el caso básico
var x = ...
termina siendo la misma:var
en Kotlin significa "esta es una variable mutable", y puede usarse tanto cuando se infiere el tipo como cuando es explícito:var x: String = ...
;var
en Java significa "esta es una variable con tipo inferido", y puede usarse tanto para variables mutables como para variablesfinal
.
var
en Java solo se puede utilizar para variables locales;var
en Kotlin se utiliza para las propiedades también.
Según las notas de la versión de Java 10, dice:
Buscamos mejorar la experiencia del desarrollador al reducir la ceremonia asociada con la escritura de código Java, al tiempo que mantenemos el compromiso de Java con la seguridad de tipo estático, al permitir que los desarrolladores elijan la declaración manifiesta, a menudo innecesaria, de tipos de variables locales. Esta característica permitiría, por ejemplo, declaraciones como:
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
Así que básicamente, es para acomodar la pereza de los programadores; en lugar de escribir List<String> list = new ArrayList<>();
, ahora puede omitir la List<String>
y reemplazarla con var
, lo que permite a Java deducir qué tipo de list
es: puede hacer esto porque la variable se inicializa cuando se define. Tenga en cuenta que tendrá que inferir el tipo de la list
al inicializar (en el caso anterior, agregaría String
a la new ArrayList<String>();
). Por lo tanto, Java aún mantiene su declaración de tipo estático.
¿Cuál es la diferencia con Kotlin?
El tipo de una variable en Kotlin definida con var
también se infiere (pero también puede ser explícito en el caso de var foo: Int
), y Kotlin también es un lenguaje tipificado estáticamente.
var
en Java 10 puede simplificar algunas declaraciones comoArrayList<String>
y el tipo de secuencia.var
solo se puede utilizar en un método para Java 10. Pero puedes escribirlo en cualquier lugar en KotlinY no hay una palabra clave
val
en Java 10, entonces podríamos usarfinal var
comoval
en Java 10.
(Creo que todos sabemos que es mutable e inmutable por defecto, así que no los describiré).
var
se considera tanto un type
(JB Lexer) como una keyword
(JB Grammar Psi) en Intellij IDEA 2018.1+.
He desarrollado un complemento para Java 10 var type hints para mostrar su tipo (solo se parece a Kotlin)