为什么`Intrinsics.checkParameterIsNotNull`没有内联?

时间:2017-12-16 09:02:11

标签: kotlin inline kotlin-interop

在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常可以看到这个做空检查的语句:

Intrinsics.checkParameterIsNotNull(foo, "foo")

如果我们探索更进一步,我们可以看到这种方法的反编译实现,它的实现与它的名称完全相同:

public static void checkParameterIsNotNull(Object value, String paramName) {
    if (value == null) {
        throwParameterIsNullException(paramName);
    }
}

由于这个类的存在(Intrinsics),我不能在没有stdlib的情况下使用Kotlin,即使我尽力避免使用stdlib中的函数,它也会自动生成对{{{ 1}}。

由于这种方法的实施非常短(并且非常经常出现),为什么这个函数没有内联?

是否有一些注释允许我们阻止Kotlin编译器生成此空检查? (可能类似于Intrinsics.checkParameterIsNotNull

对于ProGuard:我很担心,因为我正在处理共享库,而ProGuard在这种情况下并不适合我。我显然知道那些代码消除工具(ProGuard,dce-js),我知道如何以及何时使用它们。
我只是问为什么函数没有内联。

3 个答案:

答案 0 :(得分:3)

我的猜测是调用这个最终方法比内联它更有效。

虽然代码可能看起来很简单,但它的字节代码相当长。内联它会损害效率。

答案 1 :(得分:1)

希望有人会出现并提供更好,更官方的技术答案,但对于初学者,我认为避免(甚至试图避免)标准库通常不是正确的方法。它包含您可能应该在任何Kotlin代码库中使用的语言的基本结构。甚至docs也说:

  

Kotlin标准图书馆为Kotlin的日常工作提供生活必需品。

如果您担心其大小,可以使用特定于平台的工具去除您不使用的任何部分 - 例如,您可以将Proguard用于Java,以及JavaScript的DCE plugin。它的大部分内容都不是相互依赖的,因此这些工具可以大大减少最终输出将包含在标准库中的代码量。

答案 2 :(得分:1)

正如已经说过的那样,Kotlin语言只能用它的stdlib展现它的真正力量。因此,我没有看到内联Intrinsics内容的理由。不应该认真对待客户试图避免使用stdlib。