Los parámetros por defecto en Kotlin permiten especificar valores por defecto directamente en la firma de la función, haciendo que el código sea más compacto y flexible. Esta capacidad mejora la legibilidad y facilita el mantenimiento, reduciendo la necesidad de crear métodos sobrecargados con diferentes números de argumentos.
En Java, para diferentes variantes de llamada a una función, a menudo es necesario escribir varios métodos sobrecargados. En Kotlin se desarrolló una forma concisa de declarar valores por defecto, lo que permitió simplificar la API.
La sobrecarga de métodos para diferentes variantes de llamada es complicada y poco práctica, lo que lleva a un código redundante y posibles errores de mantenimiento.
Kotlin permite declarar parámetros por defecto directamente en la definición de la función. Esto se implementa a través de métodos sintéticos compañeros en el bytecode de JVM (si se llama desde Java) o mediante el simple paso de valores (desde Kotlin). Junto con los parámetros nombrados, esto hace que la interfaz de llamada a funciones sea muy poderosa.
fun greet(name: String = "Guest", greeting: String = "Hello") { println("$greeting, $name!") } greet() // Hello, Guest! greet("Alice") // Hello, Alice! greet(greeting = "Hi") // Hi, Guest! greet("Bob", greeting = "Welcome") // Welcome, Bob!
¿Se pueden usar parámetros por defecto en funciones dentro de interfaces?
Sí, pero en este caso el valor por defecto se implementa solo en la llamada desde Kotlin, y al llamar a tal método desde Java se debe especificar claramente los argumentos.
¿Se puede especificar un parámetro por defecto para los primeros (no a la derecha) parámetros, y no solo para los últimos?
Sí, en Kotlin esto es posible, especialmente si se utilizan argumentos nombrados al llamar. Sin embargo, al usar la función desde Java pueden surgir complicaciones, ya que Java no admite parámetros nombrados, y los parámetros por defecto deben ir a la derecha.
¿Cómo funciona el orden de argumentos al usar de forma mixta parámetros posicionales y nombrados?
En Kotlin, después del primer argumento nombrado, todos los siguientes deben ser nombrados, de lo contrario se producirá un error de compilación.
greet("Ivan", greeting = "Zdrastvuyte") // OK greet(greeting = "Zdrastvuyte", "Ivan") // Error: no se puede pasar un posicional después de un argumento nombrado
En la biblioteca de logging se implementaron 10 métodos sobrecargados para diferentes combinaciones de logging (con Exception, con Tag, sin, etc.), mantenerlos es incómodo.
Pros:
Contras:
Se usa una función con argumentos por defecto:
fun log(msg: String, tag: String = "", throwable: Throwable? = null) { ... }
Pros:
Contras: