gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:32:07 24 4
gpt4 key购买 nike

总的来说,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com