2016-08-05 2 views
7

quelle est la meilleure solution? utiliser lambda nullable ou passer lambda vide comme paramètre par défaut? kotlin optimise en quelque sorte lambda vide? ou créer une nouvelle instance qui ne fait rien?nul ou vide lambda comme valeur par défaut

class Test1(val action:() -> Unit = {})

Malheureusement, je ne comprends pas du code généré octet. Analysons

val test11 = Test1()

après décompilation nous donne

private static final Test1 test11 = new Test1((Function0)null, 1, (DefaultConstructorMarker)null);

et enfin comme lambda est passé quelque chose comme ça

var1 = (Function0)null.INSTANCE;

modifier: questions cachées est : Comment Kotlin traite-t-il le vide lambda comme valeur par défaut?

+0

Quelle est la solution mieux dépend de ce que vous essayez d'atteindre ou d'optimiser pour? – miensol

+1

Je ne voudrais pas avoir des instances inutiles et vides. Je sais que la solution la plus simple est d'avoir un lambda nullable mais cela implique des constructions moche '' 'action? .invoke()' ''. –

+0

@ PawełByszewski quelles sont vos préoccupations au sujet de '' 'classe Test1 (val action:() -> Unit = {})' ''? – ruX

Répondre

10

Il est certainement plus idiomatiques de passer un lambda vide plutôt que nulle comme valeur par défaut pour un paramètre lambda. Le décompilateur utilisé dans IntelliJ IDEA ne gère pas toujours bien le bytecode de Kotlin, ce que vous voyez dans sa sortie dans ce cas ne reflète pas ce qui se passe réellement. En réalité, le lambda vide sera compilé en une classe imbriquée singleton en implémentant l'interface FunctionN correspondante avec un corps vide, et l'instance singleton sera utilisée comme valeur par défaut.

Voir my talk slides pour plus d'informations sur la façon dont les paramètres par défaut sont mises en œuvre Kotlin.

+2

Comment vérifier si lambda est vide? – Sunstrike

+0

@Sunstrike Il n'y a aucun moyen de faire cela. Pourquoi pensez-vous que vous en avez besoin? – yole

+0

question a ouvert une https://stackoverflow.com/questions/45799825/how-to-check-lambda-emptiness-in-kotlin et probablement solution obtenu – Sunstrike