web-dev-qa-db-ja.com

デフォルト値としてのnullまたは空のラムダ

どちらのソリューションが優れていますか? null可能なラムダを使用するか、デフォルトのパラメーターとして空のラムダを渡しますか? kotlinはどういうわけか空のラムダを最適化しますか?または何もしない新しいインスタンスを作成しますか?

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

残念ながら、生成されたバイトコードを理解できません。分析しましょう

val test11 = Test1()

逆コンパイル後、

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

そして最後にラムダがこのようなものを渡されると

var1 = (Function0)null.INSTANCE;

編集:非表示の質問は次のとおりです。Kotlinは空のラムダをデフォルト値としてどのように扱いますか?

12

ラムダパラメータのデフォルト値としてnullではなく空のラムダを渡す方が間違いなくより慣用的です。

IntelliJで使用される逆コンパイラーIDEAは、常にKotlinバイトコードを適切に処理するわけではないため、この場合の出力に表示される内容は、実際に発生することを反映していません。実際には、空のラムダがコンパイルされます。空のボディを持つ対応するFunctionNインターフェイスを実装するシングルトンネストされたクラスに、シングルトンインスタンスがデフォルト値として使用されます。

Kotlinでのデフォルトパラメータの実装方法の詳細については、 my talk slides を参照してください。

14
yole

公開された関数の最後のパラメーターを調べます。

internal fun showDialog(title: String, message:String?= null, okButtonAction: () -> Unit, koButtonAction:() -> Unit = {}){ //do things.....}
5
Catluc