这是一个理论问题。我有一个我自己设计的对象,带有一堆变量,方法等。我重写了toString方法,主要是为了记录目的,返回变量的值。在我看来,比较这个对象的实例最简单,最直接的方法是比较从toString方法返回的内容。例如,equals方法可能看起来像
function initialize2()
{
var myLatLng = new google.maps.LatLng($lat,$lon);
var mapOptions = {
zoom: 17,
center: myLatLng,
mapTypeId: google.maps.MapTypeId.SATELLITE
};
有没有理由不这样做?
答案 0 :(得分:5)
避免这种模式的一个原因是速度:为了使用toString()
来比较相等性,你必须这样做:
String
this
对象
String
instance
对象
String
到第二个String
字符
如果直接进行比较,可以跳过大部分内容。例如,比较int
直接比较4个字节,而比较它们的字符串表示最多需要9个字节的比较。其他数据类型也会发生类似情况。
答案 1 :(得分:3)
由于性能原因没有按照dasblinkenlight简要概括的那样做你所要求的。
避免这种模式的另一个重要原因与toString()
方法的一般合同有关。类Object的所有可重写方法都有一个常规契约。因为这些方法是由您在Java中定义的每个类继承的,并且因为它们在许多自定义类中经常被覆盖,所以了解并遵守它们的一般契约非常重要。
toString()
的一般合约是最简单的Object方法:
返回对象的字符串表示形式。一般来说, toString方法返回一个“文本表示”的字符串 宾语。结果应该是简洁但信息丰富的表示 一个人很容易阅读。建议所有人 子类重写此方法。
不要求toString()返回的字符串符合特定格式,也不要求您必须指定作为API的一部分返回的字符串的格式。
因为这样,toString()返回的对象的字符串表示形式通常是实现细节,可以从类的一个版本自由更改为下一个版本。更改toString()
返回的字符串表示形式可能会导致程序失败,如果您的基础等于它们的比较。
不基于等同于toString()
方法的比较的另一个原因是,这样做不会为您的类提供所需的基础结构,以便它可以与Java Collections Framework一起使用。 Java Collections类需要格式良好的equals()
和hashCode()
方法来存储在其中的对象才能正常工作:
如果你正在编写的类有可能在任何Java Collections Framework类中使用和/或它可能被另一个程序员使用,那么编写格式良好的代价是值得的。 equals()
和hashCode()
方法。
由于任何格式合理的equals()
方法的性能都会超过基于toString()
的字符串比较的性能......并且因为许多类应该具有格式良好的等号()方法无论如何......你也可以继续使用自定义equals()
方法。