2016-08-05 27 views
7

welche Lösung ist besser? nullable Lambda verwenden oder leeres Lambda als Standardparameter übergeben? würde kotlin irgendwie leeren lambda optimieren? oder eine neue Instanz erstellen, die nichts tut?null oder leer Lambda als Standardwert

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

Leider verstehe ich nicht Byte-Code erzeugt. Lets analysieren

val test11 = Test1()

nach Dekompilierungsprozeß uns

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

gibt und schließlich als eine Lambda ist so etwas wie dieses

var1 = (Function0)null.INSTANCE;

bearbeiten

geben: die verborgenen Fragen ist : Wie behandelt Kotlin leer? Lambda als Standardwert?

+0

Welche Lösung ist besser, hängt davon ab, was Sie erreichen oder optimieren möchten? – miensol

+1

Ich möchte keine unnötigen, leeren Instanzen haben. Ich weiß, die einfachste Lösung ist es, Nullable Lambda zu haben, aber das bedeutet hässliche Konstruktionen '' 'Aktion? .invoke()' ''. –

+0

@ PawełByszewski Was sind deine Sorgen über '' 'Klasse Test1 (val Aktion:() -> Unit = {})' '? – ruX

Antwort

10

Es ist definitiv idiomatischer, ein leeres Lambda als Null als Standardwert für einen Lambda-Parameter zu übergeben.

Der in IntelliJ IDEA verwendete Decompiler behandelt den Kotlin-Bytecode nicht immer besonders gut. Daher spiegelt die Ausgabe in diesem Fall nicht wider, was tatsächlich passiert. In Wirklichkeit wird das leere Lambda in eine verschachtelte Singleton-Klasse kompiliert, die die entsprechende Schnittstelle FunctionN mit einem leeren Body implementiert, und die Singleton-Instanz wird als Standardwert verwendet.

Weitere Informationen darüber, wie Standardparameter in Kotlin implementiert werden, finden Sie unter my talk slides.

+2

Wie zu prüfen, ob Lambda leer ist? – Sunstrike

+0

@Sunstrike Es gibt keine Möglichkeit, das zu tun. Warum denkst du, dass du das brauchst? – yole

+0

Eröffnet eine Frage https://stackoverflow.com/questions/45799825/how-to-check-lambda-emptiness-in-kotlin und wahrscheinlich bekam Lösung – Sunstrike