Eclipse Xtend:覆盖 equals() 与 operator_equals()
Eclipse Xtend: Overriding equals() vs. operator_equals()
如果要声明相等性检查,在Xtend中应该实现哪个方法?
据我所知,如果我使用“==”运算符,那么它会被编译为 Java.
中的 equals() 调用
如果是这样,那么当我可以简单地覆盖 equals() 时,为什么还要定义 operator_equals()?
更新:正如@kapex 指出的那样,不建议覆盖“==”,因为它会导致代码在 Xtend 和 Java 中表现不同,示例如下:
class Person {
override equals(Object person) {
true // We are all the same
}
def operator_equals(Person person) {
false // We are all different
}
}
如果您的目标是改变 "equal to" 行为,那么您应该简单地覆盖 equals
(和 hashCode
)。
如果您希望它具有与 equals
不同的行为,您只需定义 operator_equals
。但你通常不希望那样。
如果重载 ==
运算符,原始的 equals
方法仍然存在,一些代码可能会使用该运算符,而其他代码将使用 equals
(例如 Java 库)。这听起来像是打破某些东西的好方法。
Xtend 为一些奇怪的用例提供重载所有运算符的能力,甚至只是为了一致性,这是有意义的,但在我看来,重新定义现有的运算符行为是不好的做法,应该避免。只重载尚未为类型定义的运算符要安全得多。
如果要声明相等性检查,在Xtend中应该实现哪个方法?
据我所知,如果我使用“==”运算符,那么它会被编译为 Java.
中的 equals() 调用如果是这样,那么当我可以简单地覆盖 equals() 时,为什么还要定义 operator_equals()?
更新:正如@kapex 指出的那样,不建议覆盖“==”,因为它会导致代码在 Xtend 和 Java 中表现不同,示例如下:
class Person {
override equals(Object person) {
true // We are all the same
}
def operator_equals(Person person) {
false // We are all different
}
}
如果您的目标是改变 "equal to" 行为,那么您应该简单地覆盖 equals
(和 hashCode
)。
如果您希望它具有与 equals
不同的行为,您只需定义 operator_equals
。但你通常不希望那样。
如果重载 ==
运算符,原始的 equals
方法仍然存在,一些代码可能会使用该运算符,而其他代码将使用 equals
(例如 Java 库)。这听起来像是打破某些东西的好方法。
Xtend 为一些奇怪的用例提供重载所有运算符的能力,甚至只是为了一致性,这是有意义的,但在我看来,重新定义现有的运算符行为是不好的做法,应该避免。只重载尚未为类型定义的运算符要安全得多。