java - 为什么 Kotlin 使用 == 来表示结构相等而引入 === 来表示引用相等

标签 java kotlin reference equality structural-equality

总的来说,Kotlin 中的每个设计决策都让人觉得它本身就很棒,并且提供了从 Java 的良好过渡。作为一名 Java 开发人员,您可以开始使用它编写代码,将 Kotlin 视为一种更简洁、样板更少的 Java,然后顺利地进入函数式编程等更高级的方面。

但我想知道的一件事是,为什么它的设计者决定让 == 的行为与 equals 相同,然后引入 === 用于引用相等性检查。我可以想象尝试让其他 Java 开发人员加入进来,让他们看到您的 Kotlin 代码并想“哦不,到处都是引用检查,应该是 equals 调用!”

在这里摆脱 Java 约定的思考过程是什么?澄清一下,我非常清楚 Kotlin 中 ==equals=== 之间的区别,我是只是想知道为什么。

最佳答案

主要原因可能是对象相等性检查比对象身份检查更频繁,因此它至少应该同样容易。

我还没有看到关于此的明确声明。但是书中有指针Kotlin In Action ,由 Kotlin 团队成员编写。 4.3.1 节,介绍== 操作符,首先描述了Java 的比较并说:

in Java, there's the well-known practice of always calling equals, and there's the well-known problem of forgetting to do so.

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

if (firstObj == secondObj)

但是检查对象相等性时间更长而且不太清楚:

if (firstObj.equals(secondObj))

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

if ((firstObj == null) ? (secondObj == null) : firstObj.equals(secondObj))

您可以看到打字和正确输入有多痛苦。 (特别是当其中一个对象是带有副作用的表达式时……)

所以很容易忘记区别,或者不被打扰,改用==。 (这很可能会导致难以察觉且间歇性咬人的 bug 。)

然而,Kotlin 使最常见的操作变得更简单:它的 == 运算符使用 equals() 检查对象是否相等,并且还负责空值检查.这解决了 Java 的“忘记这样做的问题”。

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

Kotlin 的动机之一是解决 Java 中的许多问题。 (事实上​​ ,JetBrains 的 comparison 语言以列出“Kotlin 中解决的一些 Java 问题”开头。)因此,这似乎是更改背后的主要原因。

关于java - 为什么 Kotlin 使用 == 来表示结构相等而引入 === 来表示引用相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55250277/

相关文章:

java - 检查当前是否显示锁屏

c++ - 直接将数组写入参数会在 C++ 中出错

c - 引用计数如何工作?

java - 使用 char 数组作为 Hashtable 键

java - 如何选择当整个应用程序调整拆分 Pane 中的 JPanel 大小时。已调整大小?

Kotlin 高阶函数组合

android - RecyclerView Observer, fragment 未更新数据

c++ - 在 C++ 中传递数组引用

java - Android 正确的方法是 : where JSON response should be parsed - in UI thread, 还是另一个?

java - BlackBerry BitmapField 关于焦点更改和单击监听器