G_H*_*G_H 3 java equality reference kotlin structural-equality
总的来说,Kotlin中的每个设计决策本身都很棒,并且可以很好地过渡到Java。作为一名Java开发人员,您可以开始将其中的Kotlin视为具有更少样板的更简洁的Java进行编码,然后平稳地进入函数式编程等更高级的方面。
然而,我想知道的一件事是为什么其设计者决定做出==与“行为相同”的行为equals,然后引入===参照相等性检查。我可以想像试图吸引其他Java开发人员参与其中,让他们看到您的Kotlin代码,然后思考:“哦,不,应该在等号调用的整个地方进行引用检查!”
离开Java约定的思路是什么?为了明确起见,我完全了解Kotlin 和==或之间的区别,我只是想知道为什么。equals===
主要原因可能是对象相等性的检查比对象身份性的检查要频繁得多,因此至少应该如此简单。
我还没有看到对此的明确声明。但是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借用,但不害怕将事情做得更好。声明使用val和var和尾随类型,作用域和开放性的不同默认值,差异处理的不同方式等)。
Kotlin的动机之一就是解决Java中的许多问题。(实际上,JetBrains 对这些语言的比较是从列出“ Kotlin中解决的某些Java问题”开始的。)因此,这很可能是该更改背后的主要原因。
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |