ProgramaciónDesarrollador de Android

¿Cómo funcionan los argumentos predeterminados y los parámetros nombrados en Kotlin? Hable sobre las diferencias con Java, los matices de la transmisión de argumentos, la compilación con métodos sobrecargados, el orden de los parámetros nombrados y posicionales. Proporcione un ejemplo.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Kotlin soporta valores predeterminados (default arguments) y parámetros nombrados (named parameters), lo que ofrece una mayor flexibilidad en comparación con Java.

Puntos clave:

  • En Kotlin, los parámetros de la función pueden tener valores predeterminados:
    fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
  • Se puede llamar a la función especificando solo los parámetros necesarios: los demás se llenarán con los valores predeterminados.
  • Los parámetros nombrados permiten especificar explícitamente el nombre del argumento, lo que es especialmente conveniente cuando una función tiene muchos parámetros:
    greet(greeting = "Hola") // -> Hola, User!
  • Se pueden combinar parámetros normales (posicionales) y parámetros nombrados, siempre que los nombrados no se utilicen en medio de la llamada.
  • A diferencia de Java (donde se hace sobrecarga para cada combinación), Kotlin compila los argumentos predeterminados en métodos sobrecargados solo para la interoperabilidad con Java; dentro de Kotlin, esto no es visible.

Matices:

  • Después de usar un argumento nombrado, los argumentos posteriores también deben ser nombrados.
  • Para usar funciones con parámetros predeterminados desde Java, pueden ser necesarias las anotaciones @JvmOverloads.

Pregunta engañosa.

¿Se pueden mezclar argumentos posicionales y nombrados en cualquier orden al llamar a una función en Kotlin?

Respuesta correcta: No, después de que se haya especificado al menos un argumento nombrado, todos los siguientes deben ser nombrados. Violación provocará un error de compilación.

// Incorrecto greet(greeting = "Hola", "Ivan") // ¡Error! // Correcto greet("Ivan", greeting = "Hola") greet(name = "Ivan", greeting = "Hola")

Ejemplos de errores reales debido al desconocimiento de los matices del tema.


Historia

El equipo integró un módulo de Kotlin con un proyecto Java heredado y olvidó agregar la anotación @JvmOverloads para la función con parámetros predeterminados. Como resultado, el código Java no veía los métodos sobrecargados necesarios, lo que causó errores de tiempo de ejecución al llamarlos.


Historia

Al refactorizar utilizando parámetros nombrados, un desarrollador cambió accidentalmente el orden de los argumentos: al cambiar los nombres de los parámetros posteriormente, esto pasó desapercibido (la tipificación no se rompió, pero ¡la semántica de la llamada cambió!). Esto llevó a extraños errores en la lógica de la UI, que no se detectaron de inmediato.


Historia

Uno de los desarrolladores, en un intento de aumentar la legibilidad, mezcló argumentos posicionales y nombrados en medio de la llamada. El código no se compilaba, pero el equipo tuvo dificultades para entender cuál era exactamente el problema, ya que a menudo habían encontrado esto en otros lenguajes y esperaban un comportamiento similar de Kotlin.