Kotlin 内在的“areEqual”方法的目的是什么?
What's the purpose of Kotlin's intrinsic `areEqual` method?
假设我有一个
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);
}
我不太明白这背后的动机。
与内联其实现相比,保留静态调用有什么好处?
通过将 Intrinsics.areEqual
保留为一个单独的函数,您仍然可以在覆盖 equals
时使用它。
Kotlin 本身在多个地方使用它,例如在 PropertyReference.java
将内在方法保留为静态方法而不是在每个使用站点内联它有几个优点:
它不会炸毁生成的二进制文件。对于大多数内在函数,字节码中的方法调用比内联体要小。因此,内联函数会导致生成的二进制文件大小的增长。
内在实现在语言演变过程中受到控制,并且在所有调用站点之间保持一致。由于内部函数作为一种方法保留,较新的 运行time 库可能会提供更好的实现,该实现将立即应用于所有调用站点,而不是内联具有不同版本的不同二进制文件。
至于为了性能而在编译时内联,在JVM世界里,这通常是行不通的。 JVM字节码是一个相当高级的抽象(堆栈机器码,与真实硬件相差甚远),JVM本身擅长在JIT编译期间内联方法调用,因此编译器通常不会运行 微优化并依赖于 JVM 实现中内置的优化。
假设我有一个
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);
}
我不太明白这背后的动机。
与内联其实现相比,保留静态调用有什么好处?
通过将 Intrinsics.areEqual
保留为一个单独的函数,您仍然可以在覆盖 equals
时使用它。
Kotlin 本身在多个地方使用它,例如在 PropertyReference.java
将内在方法保留为静态方法而不是在每个使用站点内联它有几个优点:
它不会炸毁生成的二进制文件。对于大多数内在函数,字节码中的方法调用比内联体要小。因此,内联函数会导致生成的二进制文件大小的增长。
内在实现在语言演变过程中受到控制,并且在所有调用站点之间保持一致。由于内部函数作为一种方法保留,较新的 运行time 库可能会提供更好的实现,该实现将立即应用于所有调用站点,而不是内联具有不同版本的不同二进制文件。
至于为了性能而在编译时内联,在JVM世界里,这通常是行不通的。 JVM字节码是一个相当高级的抽象(堆栈机器码,与真实硬件相差甚远),JVM本身擅长在JIT编译期间内联方法调用,因此编译器通常不会运行 微优化并依赖于 JVM 实现中内置的优化。