Пункт № 3 является слабым звеном в этом аргументе, и я на самом деле категорически не согласен с ним.Ваш инвариант (переупорядочен)
x.equals(y) == x.toString().equals(y.toString());
Я бы сказал, скорее:
x.equals(y) → x.toString().equals(y.toString());
То есть, логическое следствие.Если x и y равны, то их toString () должны быть равны, но равный toString () означает, что не обязательно означает, что объекты равны (представьте себе отношение equals()
: hashCode()
;равные объекты должны иметь одинаковый хеш-код, но тот же хеш-код может * не означать, что объекты равны).
По сути, toString()
на самом деле не имеет никакого значения'в программном смысле, и я думаю, что вы пытаетесь наполнить его одним.toString()
наиболее полезен в качестве инструмента для ведения журнала и т. Д .;Вы спрашиваете, насколько полезным было бы получить переопределенный toString()
:
throw new IlegalArgumentException(this + " may not marry self");
Я бы сказал, что это массово полезно.Скажем, вы заметили много ошибок в своих журналах и видите:
IllegalArgumentException: com.foo.Person@1234ABCD cannot marry self
IllegalArgumentException: com.foo.Person@2345BCDE cannot marry self
IllegalArgumentException: com.foo.Person@3456CDEF cannot marry self
IllegalArgumentException: com.foo.Person@4567DEFA cannot marry self
что вы делаете?Вы понятия не имеете что происходит.Если вы видите:
IllegalArgumentException: Person["Fred Smith", id=678] cannot marry self
IllegalArgumentException: Person["Mary Smith", id=679] cannot marry self
IllegalArgumentException: Person["Mustafa Smith", id=680] cannot marry self
IllegalArgumentException: Person["Emily-Anne Smith", id=681] cannot marry self
, то у вас действительно есть шанс выяснить, что происходит («Эй, кто-то пытается заставить семью Смитов жениться на себе»), и это может фактически помочь в отладке и т. Д.Идентификаторы объектов Java не дают никакой информации вообще .