Kotlin

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ícate

Declaració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.

Aprende Kotlin GRATIS online

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.

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

Kotlin

Introducción Y Entorno

Instalación Y Primer Programa De Kotlin

Kotlin

Introducción Y Entorno

Tipos De Datos, Variables Y Constantes

Kotlin

Sintaxis

Operadores Y Expresiones

Kotlin

Sintaxis

Cadenas De Texto Y Manipulación

Kotlin

Sintaxis

Estructuras De Control

Kotlin

Sintaxis

Funciones Y Llamada De Funciones

Kotlin

Sintaxis

Clases Y Objetos

Kotlin

Programación Orientada A Objetos

Herencia Y Polimorfismo

Kotlin

Programación Orientada A Objetos

Interfaces Y Clases Abstractas

Kotlin

Programación Orientada A Objetos

Data Classes Y Destructuring

Kotlin

Programación Orientada A Objetos

Tipos Genéricos Y Varianza

Kotlin

Programación Orientada A Objetos

Listas, Conjuntos Y Mapas

Kotlin

Estructuras De Datos

Introducción A La Programación Funcional

Kotlin

Programación Funcional

Funciones De Primera Clase Y De Orden Superior

Kotlin

Programación Funcional

Inmutabilidad Y Datos Inmutables

Kotlin

Programación Funcional

Composición De Funciones

Kotlin

Programación Funcional

Monads Y Manejo Funcional De Errores

Kotlin

Programación Funcional

Operaciones Funcionales En Colecciones

Kotlin

Programación Funcional

Transformaciones En Monads Y Functors

Kotlin

Programación Funcional

Funciones Parciales Y Currificación

Kotlin

Programación Funcional

Introducción A Las Corutinas

Kotlin

Coroutines Y Asincronía

Asincronía Con Suspend, Async Y Await

Kotlin

Coroutines Y Asincronía

Concurrencia Funcional

Kotlin

Coroutines Y Asincronía

Evaluación

Kotlin

Evaluación

Accede GRATIS a Kotlin y certifícate

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

  1. Comprender la diferencia entre var y val en Kotlin.
  2. Declarar variables utilizando inferencia de tipos.
  3. Conocer los tipos de datos primitivos y sus rangos en Kotlin.
  4. Aprender a utilizar literales numéricos, caracteres y booleanos.
  5. Convertir tipos numéricos explícitamente en Kotlin.
  6. Declarar constantes de tiempo de compilación con const val.