簡體   English   中英

Kotlin為lambda生成內部類

[英]Kotlin generates inner class for lambda

在我的代碼中,我有這樣的事情:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        presenter.onCreate()

        fabContainer.onClick {
            presenter.onLoginButtonClicked(...)
        }
    }

當我反編譯apk並檢查byteCode時,出現如下內容:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.presenter.onCreate();
        Sdk23ListenersKt.onClick((ProgressFloatingActionButton) _$_findCachedViewById(com.prozis.prozisgo.prozisgo.R.id.fabContainer), new ActAuthLogin$onCreate$1(this));
    }

final class ActAuthLogin$onCreate$1 extends Lambda implements Function1<View, Unit> {
    final /* synthetic */ ActAuthLogin this$0;

    ActAuthLogin$onCreate$1(ActAuthLogin actAuthLogin) {
        this.this$0 = actAuthLogin;
        super(1);
    }

    public final void invoke(View it) {
        this.this$0.getPresenter().onLoginButtonClicked(StringsKt__StringsKt.trim(((EditText) this.this$0._$_findCachedViewById(R.id.email)).getText()).toString(), StringsKt__StringsKt.trim(((EditText) this.this$0._$_findCachedViewById(R.id.password)).getText()).toString(), ((CheckBox) this.this$0._$_findCachedViewById(R.id.rememberEmail)).isChecked());
    }
}

為什么要創建這個類,我該如何避免它? 這是正常的Kotlin字節代碼,我認為lambdas被解析為它們被調用的類中的靜態方法。

如果lambda不引用周圍上下文中的任何內容,則將其編譯為靜態方法。

在您的示例中,您正在引用presenter ,它是活動類的實例字段。 為了在onClick處理程序中捕獲該引用,必須創建一個新類的實例(在這種情況下,Kotlin捕獲對activity類的引用並通過其屬性訪問presenter)。

無論是使用Kotlin還是使用普通Java,都無法避免在這里創建額外的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM