Kotlin内在的“ areEqual”方法的目的是什么?

时间:2019-07-29 12:41:50

标签: kotlin compiler-construction language-design

假设我有一个

data class Eq(x: Int?)

这将生成一个看起来像这样的equals方法

public boolean equals(Object other){
    if(this == other) return true;
    if(!(other instanceof Eq)) return false;
    Eq otherEq = (Eq) other;
    return Intrinsics.areEqual(this.x, otherEq.x);
}

内在

public static boolean areEqual(Object first, Object second){
    return first == null ? second == null : first.equals(second);
}

我不太了解其背后的动机。

相对于内联其实现,保持静态调用有什么好处?

2 个答案:

答案 0 :(得分:4)

将内在方法保留为静态方法,而不是在每个使用位置都对其进行内联,具有一些优点:

  • 它不会炸毁生成的二进制文件。对于大多数内在函数,字节码中的方法调用比内联主体要小。因此,对内在函数进行内联将导致生成的二进制文件大小增加。

  • 内在实现在语言演化过程中受到控制,并且在所有呼叫站点之间都保持一致。由于将内在函数保留为一种方法,因此较新的运行时库可能会提供更好的实现,该实现将立即应用于所有调用站点,而不是内联了不同版本的不同二进制文件。

为了在性能上在编译时进行内联,在JVM世界中,这通常是不可行的。 JVM字节码是相当高级的抽象(堆栈计算机代码,与真正的硬件相去甚远),并且JVM本身擅长在JIT编译期间内联方法调用,因此,编译器通常不会运行微优化并依靠JVM实现中内置的优化。

答案 1 :(得分:1)

通过将Intrinsics.areEqual保留为单独的功能,当您覆盖equals时仍可以使用它。

Kotlin本身在多个地方都使用了此功能,例如在PropertyReference.java