5

在 Kotlin 中,如果我们将一些 Kotlin 字节码反编译为 Java,我们经常可以看到这样的语句,它会进行 null 检查:

Intrinsics.checkParameterIsNotNull(foo, "foo")

如果我们进一步探索,我们可以看到这个方法的反编译实现,它的实现和它的名字完全一样:

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

由于这个IntrinsicsIntrinsics.checkParameterIsNotNull

既然这个方法的实现很短(而且经常出现),为什么不内联这个函数呢?

是否有一些注释可以让我们阻止 Kotlin 编译器生成这个空检查?(也许像@TrustedNotNull

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

4

2 回答 2

3

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

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

于 2017-12-16T09:28:26.720 回答
1

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

Kotlin 标准库为使用 Kotlin 的日常工作提供生活必需品。

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

于 2017-12-16T09:09:55.710 回答