在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:我'm worried because I'm正在处理共享库,在这种情况下ProGuard不适合我 . 我显然知道那些代码消除工具(ProGuard,dce-js),我知道如何以及何时使用它们 .
我只是问为什么函数没有内联 .
3 回答
我的猜测是调用这个最终方法比内联它更有效 .
虽然代码可能看起来很简单,但它的字节代码相当长 . 内联它会损害效率 .
希望有人会出现并提供更好,更官方的技术答案,但对于初学者,我认为避免(甚至试图避免)标准库通常不是正确的方法 . 它包含您可能应该在任何Kotlin代码库中使用的语言的基本结构 . 甚至docs说:
如果您使用 - 例如,您可以使用Proguard表示Java,使用DCE plugin表示JavaScript . 它的大部分内容不是相互依赖的,因此这些工具可以大大减少最终输出将包含在标准库中的代码量 .
如前所述,Kotlin语言只能用它的stdlib展现它的真正力量 . 因此,我没有看到内联
Intrinsics
内容的理由 . 不应该认真对待客户试图避免使用stdlib .