どちらのソリューションが優れていますか? 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は空のラムダをデフォルト値としてどのように扱いますか?
ラムダパラメータのデフォルト値としてnullではなく空のラムダを渡す方が間違いなくより慣用的です。
IntelliJで使用される逆コンパイラーIDEAは、常にKotlinバイトコードを適切に処理するわけではないため、この場合の出力に表示される内容は、実際に発生することを反映していません。実際には、空のラムダがコンパイルされます。空のボディを持つ対応するFunctionN
インターフェイスを実装するシングルトンネストされたクラスに、シングルトンインスタンスがデフォルト値として使用されます。
Kotlinでのデフォルトパラメータの実装方法の詳細については、 my talk slides を参照してください。
公開された関数の最後のパラメーターを調べます。
internal fun showDialog(title: String, message:String?= null, okButtonAction: () -> Unit, koButtonAction:() -> Unit = {}){ //do things.....}