Kotlin
Tutorial Kotlin: Tipos de datos, variables y constantes
Kotlin tipos de datos, variables y constantes: guía esencial para comprender la mutabilidad, inferencia de tipos y declaración eficiente en programación.
Aprende Kotlin GRATIS y certifícateDeclaración y asignación de variables
En Kotlin, para declarar una variable, se utilizan las palabras clave var
y val
. La diferencia entre ambas radica en la mutabilidad: var
declara una variable mutable cuyo valor puede cambiar, mientras que val
declara una variable inmutable que, una vez asignada, no puede modificarse.
Ejemplo de declaración mutable:
var edad: Int = 25
En este caso, edad
es una variable mutable de tipo Int
inicializada con el valor 25. Al ser mutable, es posible cambiar su valor posteriormente:
edad = 26
Por otro lado, una declaración inmutable se realiza con val
:
val nombre: String = "María"
Aquí, nombre
es una variable inmutable de tipo String
. Intentar modificar su valor generaría un error de compilación:
nombre = "Ana" // Error: Val cannot be reassigned
Kotlin cuenta con inferencia de tipos, lo que permite omitir la especificación del tipo si este puede deducirse a partir del valor asignado:
val pi = 3.1416
En este ejemplo, pi
será de tipo Double
debido al valor asignado. Sin embargo, en situaciones donde el tipo no es evidente o para mayor claridad, es recomendable especificarlo explícitamente.
Es importante inicializar las variables al declararlas, ya que Kotlin requiere que se les asigne un valor inicial. No obstante, es posible declarar variables sin valor inicial utilizando tipos anulables o inicialización tardía con lateinit
para variables mutables y lazy
para inmutables, aunque estas son características más avanzadas.
Los nombres de las variables deben seguir las convenciones de nomenclatura de Kotlin: comenzar con una letra o guion bajo, seguidos de letras, dígitos o guiones bajos. Además, es buena práctica utilizar nombres descriptivos que reflejen su propósito en el código.
Tipos de datos primitivos
En Kotlin, los tipos de datos primitivos son esenciales para representar valores básicos como números, caracteres y booleanos. Aunque en Kotlin todo es un objeto, los tipos numéricos primitivos se optimizan en tiempo de compilación para mejorar el rendimiento.
Números enteros
Para trabajar con números enteros, Kotlin ofrece cuatro tipos principales, diferenciados por el rango de valores que pueden almacenar:
- Byte: representa números enteros de 8 bits con signo. Rango: de -128 a 127.
- Short: representa números enteros de 16 bits con signo. Rango: de -32,768 a 32,767.
- Int: representa números enteros de 32 bits con signo. Rango: de -2,147,483,648 a 2,147,483,647.
- Long: representa números enteros de 64 bits con signo. Rango: de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807.
Ejemplos:
val edad: Int = 30
val distancia: Long = 9_223_372_036_854_775_807L
Es importante notar que para declarar un Long literal, se utiliza la letra L
al final del valor. Además, Kotlin permite usar guiones bajos para separar cifras y mejorar la legibilidad.
Números de coma flotante
Para representar números con decimales, Kotlin dispone de:
- Float: representa números de coma flotante de 32 bits. Se utiliza para valores con menos precisión.
- Double: representa números de coma flotante de 64 bits. Es el tipo por defecto para valores decimales.
Ejemplos:
val pi: Double = 3.1415926535
val euler: Float = 2.7182818F
Al asignar un literal Float, se añade la letra F
al final del número. Sin embargo, los literales decimales sin sufijo se interpretan como Double por defecto.
Caracteres
El tipo Char se utiliza para representar un único carácter Unicode. Los valores de tipo Char se delimitan con comillas simples.
Ejemplo:
val inicial: Char = 'A'
Los caracteres pueden representar letras, dígitos o símbolos especiales. Además, es posible utilizar secuencias de escape como \n
para un salto de línea o \uFFFF
para un carácter Unicode específico.
Booleanos
El tipo Boolean solo puede tener dos valores posibles: true
o false
. Se utiliza para representar condiciones lógicas y controlar el flujo del programa.
Ejemplo:
val esAdulto: Boolean = true
Los booleanos son fundamentales en estructuras de control como condiciones if
, bucles y operadores lógicos.
Literales numéricos
Kotlin ofrece diversas formas de representar literales numéricos:
- Binarios: se antepone
0b
al valor. Ejemplo:val binario = 0b1010
- Hexadecimales: se antepone
0x
al valor. Ejemplo:val hexadecimal = 0xFF
- Separadores de dígitos: se pueden usar guiones bajos para mejorar la legibilidad. Ejemplo:
val millon = 1_000_000
Conversión entre tipos
Para convertir entre tipos numéricos, se utilizan funciones explícitas de conversión, ya que Kotlin no realiza conversión implícita entre tipos más pequeños y más grandes.
Ejemplo:
val numeroInt: Int = 100
val numeroLong: Long = numeroInt.toLong()
Las funciones de conversión más comunes son: toByte()
, toShort()
, toInt()
, toLong()
, toFloat()
, toDouble()
y toChar()
.
Inmutabilidad y tipos primitivos
Aunque los valores de los tipos primitivos pueden parecer mutables, es recomendable asignarlos a variables inmutables usando val
para garantizar que su valor no cambie inadvertidamente.
Ejemplo:
val gravedad: Double = 9.80665
La inmutabilidad es un principio que ayuda a prevenir errores y hacer que el código sea más predecible.
Resumen de tipos primitivos
Los tipos primitivos son la base para manejar datos simples en Kotlin. Comprender sus características y cómo utilizarlos adecuadamente es esencial para escribir código eficiente y seguro.
Uso de constantes
En Kotlin, una constante es un valor que no cambia durante la ejecución del programa y que se conoce en tiempo de compilación. Para declarar constantes, se utiliza la palabra clave const
antes de val
, formando const val
. Estas constantes deben ser variables inmutables cuyo valor se asigna en tiempo de compilación y no puede modificarse posteriormente.
Ejemplo de declaración de una constante:
const val PI = 3.1416
En este caso, PI
es una constante de tipo Double
cuyo valor es 3.1416. Al ser declarada con const val
, su valor se conoce en tiempo de compilación y puede usarse en contextos donde se requiera un valor constante, como anotaciones o inicializadores de otras constantes.
Es importante distinguir entre val
y const val
. Mientras que val
declara una variable inmutable cuyo valor se asigna en tiempo de ejecución, const val
se utiliza para valores que se conocen en tiempo de compilación. Por ejemplo:
val fechaActual = obtenerFecha() // Valor asignado en tiempo de ejecución
Aquí, fechaActual
es inmutable, pero su valor se obtiene durante la ejecución del programa, no en tiempo de compilación. Por lo tanto, no puede ser declarada con const val
.
Las constantes deben ser tipos primitivos o cadenas de caracteres. Esto significa que solo se pueden asignar valores de tipos como Int
, Long
, Double
, Float
, Boolean
, Char
y String
. No es posible utilizar tipos personalizados o clases para constantes de tiempo de compilación.
Ejemplos adicionales de constantes:
const val MAX_INTENTOS = 5
const val MENSAJE_BIENVENIDA = "Bienvenido al sistema"
En el primer ejemplo, MAX_INTENTOS
es una constante entera que podría usarse para limitar el número de intentos en un proceso. En el segundo, MENSAJE_BIENVENIDA
es una constante de tipo String
utilizada para mostrar un mensaje al usuario.
Las constantes deben declararse a nivel superior o dentro de un objeto. No pueden declararse dentro de funciones ni de clases no objeto. Esto se debe a que necesitan estar disponibles en tiempo de compilación y no dependen de una instancia.
Ejemplo de constante dentro de un objeto:
object Configuracion {
const val URL_BASE = "https://api.ejemplo.com/"
}
Aquí, URL_BASE
es una constante accesible a través del objeto Configuracion
. Este patrón es útil para agrupar configuraciones o valores constantes relacionados.
Al utilizar constantes, se mejora la legibilidad y mantenibilidad del código, ya que se evitan números mágicos o cadenas repetidas dispersas en el código. Además, facilita la actualización de valores que pueden cambiar en el futuro, centralizándolos en una única declaración.
Es importante evitar la confusión entre val
y const val
. Aunque ambas palabras claves se utilizan para declarar valores inmutables, únicamente const val
define una constante de tiempo de compilación. Usar val
es adecuado para valores inmutables que se conocen en tiempo de ejecución.
Un punto a considerar es que las constantes no pueden asignarse a valores que resulten de llamadas a funciones o cálculos en tiempo de ejecución. Por ejemplo, no es posible hacer lo siguiente:
const val TIEMPO_EJECUCION = System.currentTimeMillis() // Error de compilación
Este código generaría un error, ya que System.currentTimeMillis()
se evalúa en tiempo de ejecución, no en tiempo de compilación. En este caso, se debe utilizar val
en lugar de const val
.
En resumen, las constantes en Kotlin proporcionan una forma segura y eficiente de manejar valores inmutables conocidos en tiempo de compilación, mejorando la consistencia y claridad del código. Es recomendable utilizarlas siempre que sea posible para valores fijos que no cambian durante la ejecución del programa.
Ejercicios de esta lección Tipos de datos, variables y constantes
Evalúa tus conocimientos de esta lección Tipos de datos, variables y constantes con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Clases genéricas con varianza y restricciones
Introducción a las corutinas
Uso de asincronía con suspend, async y await
Formateo de cadenas texto
Uso de monads y manejo funcional de errores
Declaración y uso de variables y constantes
Uso de la concurrencia funcional con corutinas
Operaciones en colecciones
Uso de clases y objetos en Kotlin
Evaluación Kotlin
Funciones de orden superior y expresiones lambda en Kotlin
Herencia y polimorfismo en Kotlin
Inmutabilidad y datos inmutables
Uso de funciones parciales y currificaciones
Primer programa en Kotlin
Introducción a la programación funcional
Introducción a Kotlin
Uso de operadores y expresiones
Sistema de inventario de tienda
Uso de data classes y destructuring
Composición de funciones
Uso de interfaces y clases abstractas
Simulador de conversión de monedas
Programación funcional y concurrencia
Creación y uso de listas, conjuntos y mapas
Transformación en monads y functors
Crear e invocar funciones
Uso de las estructuras de control
Todas las lecciones de Kotlin
Accede a todas las lecciones de Kotlin y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Kotlin
Introducción Y Entorno
Instalación Y Primer Programa De Kotlin
Introducción Y Entorno
Tipos De Datos, Variables Y Constantes
Sintaxis
Operadores Y Expresiones
Sintaxis
Cadenas De Texto Y Manipulación
Sintaxis
Estructuras De Control
Sintaxis
Funciones Y Llamada De Funciones
Sintaxis
Clases Y Objetos
Programación Orientada A Objetos
Herencia Y Polimorfismo
Programación Orientada A Objetos
Interfaces Y Clases Abstractas
Programación Orientada A Objetos
Data Classes Y Destructuring
Programación Orientada A Objetos
Tipos Genéricos Y Varianza
Programación Orientada A Objetos
Listas, Conjuntos Y Mapas
Estructuras De Datos
Introducción A La Programación Funcional
Programación Funcional
Funciones De Primera Clase Y De Orden Superior
Programación Funcional
Inmutabilidad Y Datos Inmutables
Programación Funcional
Composición De Funciones
Programación Funcional
Monads Y Manejo Funcional De Errores
Programación Funcional
Operaciones Funcionales En Colecciones
Programación Funcional
Transformaciones En Monads Y Functors
Programación Funcional
Funciones Parciales Y Currificación
Programación Funcional
Introducción A Las Corutinas
Coroutines Y Asincronía
Asincronía Con Suspend, Async Y Await
Coroutines Y Asincronía
Concurrencia Funcional
Coroutines Y Asincronía
Evaluación
Evaluación
Certificados de superación de Kotlin
Supera todos los ejercicios de programación del curso de Kotlin y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender la diferencia entre
var
yval
en Kotlin. - Declarar variables utilizando inferencia de tipos.
- Conocer los tipos de datos primitivos y sus rangos en Kotlin.
- Aprender a utilizar literales numéricos, caracteres y booleanos.
- Convertir tipos numéricos explícitamente en Kotlin.
- Declarar constantes de tiempo de compilación con
const val
.