为什么Kotlin为什么将==用于结构相等并引入===用于引用相等

G_H*_*G_H 3 java equality reference kotlin structural-equality

总的来说,Kotlin中的每个设计决策本身都很棒,并且可以很好地过渡到Java。作为一名Java开发人员,您可以开始将其中的Kotlin视为具有更少样板的更简洁的Java进行编码,然后平稳地进入函数式编程等更高级的方面。

然而,我想知道的一件事是为什么其设计者决定做出==与“行为相同”的行为equals,然后引入===参照相等性检查。我可以想像试图吸引其他Java开发人员参与其中,让他们看到您的Kotlin代码,然后思考:“哦,不,应该在等号调用的整个地方进行引用检查!”

离开Java约定的思路是什么?为了明确起见,我完全了解Kotlin 和==或之间的区别,我只是想知道为什么。equals===

gid*_*dds 9

主要原因可能是对象相等性的检查比对象身份性的检查要频繁得多,因此至少应该如此简单。

我还没有看到对此的明确声明。但是Kotlin团队的成员在《 Kotlin In Action》一书中有一个指针。介绍==操作符的第4.3.1节首先描述了Java的比较,并说:

在Java中,有一个总是调用的众所周知的实践equals,并且还有一个众所周知的忘记这样做的问题。

在Java中,检查对象身份很容易:

if (firstObj == secondObj)
Run Code Online (Sandbox Code Playgroud)

但是检查对象是否相等的时间更长,而且不太清晰:

if (firstObj.equals(secondObj))
Run Code Online (Sandbox Code Playgroud)

—或者更确切地说,如果您不想冒险遇到NullPointerException:

if ((firstObj == null) ? (secondObj == null) : firstObj.equals(secondObj))
Run Code Online (Sandbox Code Playgroud)

您可以看到打字和正确治疗的痛苦。(特别是当这些对象之一是带有副作用的表达式时……)

因此,很容易忘记它们之间的差异,或者不去理会它们,==而是使用它。(这很可能会导致细微,难以发现和间歇咬伤的错误。)

但是,Kotlin使最常见的操作变得更容易:它的==运算符使用来检查对象的相等性equals(),并且还要进行null检查。这解决了Java的“忘记这样做的问题”。

(尽管与Java代码的互操作性显然是一个主要目标,但JetBrains并没有将自己局限于尝试看起来像Java; Kotlin尽可能从Java借用,但不害怕将事情做得更好。声明使用valvar和尾随类型,作用域和开放性的不同默认值,差异处理的不同方式等)。

Kotlin的动机之一就是解决Java中的许多问题。(实际上,JetBrains 对这些语言的比较是从列出“ Kotlin中解决的某些Java问题”开始的。)因此,这很可能是该更改背后的主要原因。