Vocabulário do Kotlin
Breves e fáceis de usar, os argumentos padrão permitem implementar sobrecargas de funções sem o boilerplate. Assim como muitos recursos do Kotlin, isso pode parecer mágico. Curioso para conhecer os segredos? Continue lendo e descubra como os argumentos padrão do Kotlin funcionam nos bastidores.
Se você precisar sobrecarregar uma função, em vez de implementar a mesma função várias vezes, você pode usar argumentos padrão:
Os argumentos padrão também podem ser aplicados a construtores:
Normalmente, o Java não reconhece a sobrecarga de valores padrão:
Para instruir o compilador a gerar os métodos de sobrecarga, use a anotação @JvmOverloads na função do Kotlin:
Vamos analisar o código Java descompilado para ver o que o compilador gera para nós: Tools -> Kotlin -> Show Kotlin Bytecode e, em seguida, pressione o botão Decompile.
Vemos que o compilador gera duas funções:
O valor do parâmetro int de play$default é computado com base no número e no índice dos argumentos que recebem um argumento padrão. Com base no valor desse parâmetro, o compilador do Kotlin sabe com quais parâmetros chamar a função play.
Em nossa chamada play() de exemplo, o argumento no índice 0 está usando o argumento padrão. Portanto, play$default é chamado com int var1 = 2⁰:
play$default((Toy)null, 1, (Object)null);
Assim, implementação de play$default sabe que o valor de var0 deve ser substituído pelo valor padrão.
Vejamos um exemplo mais complexo do comportamento do parâmetro int. Vamos expandir nossa função play e, no local da chamada, usar o argumento padrão para doggo e toy:
Vejamos o que aconteceu no código descompilado:
Agora, vemos que o parâmetro int é 5. Isso foi calculado assim: os parâmetros nas posições 0 e 2 estão usando o argumento padrão, portanto, var3 = 2⁰ + 2² = 5. Em uma operação bitwise AND, os parâmetros são avaliados assim:
Com base no bitmask aplicado a var3, o compilador pode calcular quais parâmetros devem ser substituídos por valores padrão.
Nos exemplos acima, você deve ter notado que o valor do parâmetro Object é sempre nulo e que, na verdade, nunca é usado na função play$default. Esse parâmetro é conectado aos valores padrão de suporte nas funções substitutas.
O que acontece quando queremos substituir uma função por argumentos padrão?
Vamos mudar o exemplo acima e:
Quando tentamos definir um valor padrão em PlayfulDoggo.play, vemos que isso não é permitido: uma função substituta não tem permissão para especificar valores padrão para seus parâmetros
Se removermos a substituição e verificarmos o código descompilado, PlayfulDoggo.play() se parecerá com o seguinte:
Isso significa que as superchamadas com argumentos padrão terão suporte futuramente? Teremos que esperar para ver.
Para os construtores, o código Java descompilado tem apenas uma diferença. Vamos dar uma olhada:
Os construtores também criam um método sintético, mas, em vez do Object usado nas funções, os construtores usam um DefaultConstructorMarker, que é chamado com nulo:
Os construtores secundários com argumentos padrão também gerarão outro método sintético utilizando um DefaultConstructorMarker, como os construtores primários:
Simples e úteis, os argumentos padrão reduzem a quantidade de código boilerplate a ser escrito para lidar com métodos sobrecarregados, permitindo definir valores padrão para os parâmetros. Assim como em muitas das palavras-chave do Kotlin, é possível compreender a mágica analisando o código que é escrito para nós. Confira nossas outras postagens sobre Vocabulário do Kotlin para saber mais.
Make sure you will visit this https://onlinejapancasinos.com/ website, my friends.
Postar um comentário
Um comentário :
Make sure you will visit this https://onlinejapancasinos.com/ website, my friends.
Postar um comentário