为什么`Intrinsics.checkParameterIsNotNull`没有内联?
在Kotlin中,如果我们将一些Kotlin字节码反编译为Java,我们经常可以看到这样的语句:
Intrinsics.checkParameterIsNotNull(foo, "foo")
如果我们继续探索,我们可以看到这个方法的反编译实现,它的实现和它的名字完全一样:
public static void checkParameterIsNotNull(Object value, String paramName) { if (value == null) { throwParameterIsNullException(paramName); } }
由于这个类( Intrinsics
)的存在,我不能使用没有stdlib的Kotlin,即使我尽我所能避免使用stdlib中的函数,它也会自动生成对Intrinsics.checkParameterIsNotNull
调用。
由于这个方法的实现非常短(而且很常见),为什么这个函数没有内联呢?
有没有一些注释可以让我们阻止Kotlin编译器生成这个空检查? (也许像@TrustedNotNull
)
对于ProGuard:我很担心,因为我正在使用共享库,在这种情况下ProGuard不适合我。 我显然知道那些代码清除工具(ProGuard,dce-js),我知道如何以及何时使用它们。
我只是问为什么是一个函数不内联。
我的猜测是,调用这个最后的方法比内联更有效率。
虽然代码可能看起来很简单,但是它的字节代码相当长。 内联会损害效率。
希望有人会出现,给出一个更好,更正式的技术答案,但对于初学者,我认为避免(甚至试图避免)标准库是不正确的方法。 它包含您可能应该在任何Kotlin代码库中使用的语言的基本结构。 即使是文件说:
Kotlin标准图书馆提供Kotlin日常工作的生活必需品。
如果您担心它的大小,可以使用特定于平台的工具来剥离您不使用的任何部分 – 例如,您可以使用Proguard for Java和JavaScript的DCE插件 。 它的大部分内容不是相互依赖的,所以这些工具可以大大减少最终输出将包含在标准库中的代码量。
正如已经说过的那样,Kotlin语言只能通过stdlib展现出真正的力量。 所以我没有看到Intrinsics
内联的原因。 不应该认真的有一个客户试图避免stdlib。