嵌套让块在Kotlin

Spa*_*318 11 android kotlin

let在Kotlin中使用多个嵌套是一个好习惯,还是应该引入一个局部变量?有没有任何开销?

webView?.let { webview ->
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        webview.setLayerType(View.LAYER_TYPE_HARDWARE, null)
    } else {
        webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
    }

    webview.webViewClient = WebViewClient()

    webview.settings.let { settings ->
        settings.javaScriptEnabled = true
        settings.setSupportZoom(false)
        settings.builtInZoomControls = false
        settings.displayZoomControls = false
        settings.loadsImagesAutomatically = true
    }
}
Run Code Online (Sandbox Code Playgroud)

zsm*_*b13 11

由于let内联(参见:什么是内联,也是官方文档),其成本与自己声明局部变量完全相同.如果您通过安全呼叫使用它,它还会添加一个空检查,您也必须手动执行此操作.

所以使用它基本上没有任何开销,只要您的代码足够清晰,只要您愿意就可以随意使用它.


例如,代码如下:

webview.settings.let { settings ->
    settings.javaScriptEnabled = true
    settings.setSupportZoom(false)
}
Run Code Online (Sandbox Code Playgroud)

...将大致转换为与此Java代码等效的字节码:

Settings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
settings.setSupportZoom(false);
Run Code Online (Sandbox Code Playgroud)

除了settings可能会被称为通用之类的东西var10000,但除此之外.重点是没有创建任何函数实例,也没有let调用函数或类似的东西,因此没有开销.

对于任何未来的问题,您可以使用Kotlin插件的字节码查看器和反编译器自己检查.