官术网_书友最值得收藏!

Referential equality and structural equality

When working with a language that supports object-oriented programming (OOP), there are two concepts of equality. The first is when two separate references point to the exact same instance in memory. The second is when two objects are separate instances in memory but have the same value. What the same value means is specified by the developer of the class. For example, for two square instances to be the same, we might just require they have the same length and width regardless of coordinates.

The former is called referential equality. To test whether two references point to the same instance, we use the === operator (triple equals) or !== for negation:

    val a = File("/mobydick.doc") 
    val b = File("/mobydick.doc") 
    val sameRef = a === b 

The value of the test a === b is false because, although a and b reference the same file on disk, they are two distinct instances of the File object.

The latter is called structural equality. To test whether two objects have the same value, we use the == operator or != for negation. These function calls are translated into the use of the equals function that all classes must define. Note that this differs from how the == operator is used in Java—in Java, the == operator is for referential equality and is usually avoided:

    val a = File("/mobydick.doc") 
    val b = File("/mobydick.doc") 
    val structural = a == b 

Note that, in the double equals check, the value was true. This is because the File object defines equality to be the value of the path. It is up to the creator of a class to determine what structural equality means for that class.

The == operator is null safe. That is, we don't need to worry if we are testing a null instance as the compiler will add the null check for us.
主站蜘蛛池模板: 黄陵县| 天峻县| 蛟河市| 淅川县| 德惠市| 思南县| 新乡市| 松原市| 凤山县| 松原市| 遂宁市| 平罗县| 吕梁市| 雅江县| 临江市| 曲沃县| 长沙市| 秦安县| 光泽县| 偃师市| 夹江县| 从江县| 马尔康县| 桃园县| 泰来县| 洮南市| 平遥县| 曲阳县| 安义县| 隆安县| 襄汾县| 博客| 密云县| 杭锦后旗| 绍兴县| 菏泽市| 利津县| 湖口县| 东山县| 承德县| 循化|