Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';Kotlin的宗旨是什么;s内在的'areEqual'方法?_Kotlin_Compiler Construction_Language Design - Fatal编程技术网

什么';Kotlin的宗旨是什么;s内在的'areEqual'方法?

什么';Kotlin的宗旨是什么;s内在的'areEqual'方法?,kotlin,compiler-construction,language-design,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);

假设我有一个

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本身在多个地方使用了这种方法,例如,在

中,保持内在作为静态方法,而不是在每个使用站点将其内联,有几个优点:

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

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

至于为了性能而在编译时进行内联,在JVM世界中,这通常是不可行的。JVM字节码是一个相当高级的抽象(一个堆栈机器代码,远离真实的硬件),而JVM本身擅长在JIT编译期间内联方法调用,因此编译器通常不运行微优化,而是依赖于JVM实现中内置的优化