I parametri predefiniti in Kotlin consentono di specificare valori predefiniti direttamente nella firma della funzione, rendendo il codice più compatto e flessibile. Questa possibilità aumenta la leggibilità e facilita la manutenzione, riducendo la necessità di creare metodi sovraccarichi con un numero diverso di argomenti.
In Java, per diverse varianti di chiamata della funzione, è spesso necessario scrivere più metodi sovraccaricati. In Kotlin è stato sviluppato un modo conciso per dichiarare valori predefiniti, il che ha semplificato l'API.
La sovraccarico dei metodi per diverse varianti di chiamata è complesso e scomodo, porta a codice ridondante e potenziali errori di supporto.
Kotlin consente di dichiarare parametri predefiniti direttamente nella definizione della funzione. Questo è implementato attraverso metodi compagni sintetici nel bytecode JVM (se chiamati da Java) oppure tramite normale passaggio di valori (da Kotlin). Insieme ai parametri nominati, questo rende l'interfaccia di chiamata delle funzioni molto potente.
fun greet(name: String = "Ospite", greeting: String = "Ciao") { println("$greeting, $name!") } greet() // Ciao, Ospite! greet("Alice") // Ciao, Alice! greet(greeting = "Ciao") // Ciao, Ospite! greet("Bob", greeting = "Benvenuto") // Benvenuto, Bob!
È possibile utilizzare parametri predefiniti nelle funzioni all'interno delle interfacce?
Sì, ma in questo caso il valore predefinito è implementato solo nella chiamata da Kotlin, e chiamando tale metodo da Java sarà necessario specificare esplicitamente gli argomenti.
È possibile specificare un parametro predefinito per i primi (sinistri) parametri, e non solo per gli ultimi?
Sì, in Kotlin è possibile, specialmente se si utilizzano argomenti nominati durante la chiamata. Tuttavia, quando si utilizza la funzione da Java, potrebbero sorgere difficoltà, poiché Java non supporta argomenti nominati, e i parametri predefiniti devono seguire a destra.
Come funziona l'ordine degli argomenti quando si utilizzano mescolati parametri posizionali e nominati?
In Kotlin, dopo il primo argomento nominato, tutti gli altri devono essere nominati, altrimenti si verifica un errore di compilazione.
greet("Ivan", greeting = "Salve") // OK greet(greeting = "Salve", "Ivan") // Errore: non è possibile passare un posizionale dopo un argomento nominato
Nella libreria di logging sono stati implementati 10 metodi sovraccaricati per diverse combinazioni di logging (con Exception, con Tag, senza ecc.), mantenere questi è scomodo.
Pro:
Contro:
Si utilizza una funzione con argomenti predefiniti:
fun log(msg: String, tag: String = "", throwable: Throwable? = null) { ... }
Pro:
Contro: