Рано утром, так что, возможно, я упускаю истинную точку вашего вопроса, этот код потерпит неудачу:
public class CIS
{
public static void main(String[] args)
{
CIString a = new CIString("Polish");
String s = "polish";
List<String> list = new ArrayList<String>();
list.add(s);
System.out.println("list contains a:" + list.contains(a));
}
}
По крайней мере, странно, что ваш код находит его и мойкод не (с точки зрения здравомыслия, не то, чтобы именно так был написан ваш код: -)
Редактировать:
public class CIS {
public static void main(String[] args) {
CIString a = new CIString("Polish");
String s = "polish";
List<CIString> list = new ArrayList<CIString>();
list.add(a);
System.out.println("list contains s:" + list.contains(s));
List<String> list2 = new ArrayList<String>();
list2.add(s);
System.out.println("list contains a:" + list2.contains(a));
}
}
Теперь код распечатывается:
list contains s:false
Calling CIString.equals from Polish
list contains a:true
Что все еще не имеет смысла ... и очень хрупко.Если два объекта равны, как a.equals (b), то они также должны быть равны, как b.equal (a), что не относится к вашему коду.
Из javadoc :
Симметрично: для любых ненулевых ссылочных значений x и y x.equals (y) должен возвращать true, если и только если y.equals (x) возвращает true.
Итак, да, пример в книге может противоречить Javadoc API коллекций, но принцип верен.Не следует создавать метод equals, который ведет себя странно, иначе со временем возникнут проблемы.
Edit 2:
Ключевой момент текста:
В Sunтекущая реализация, она возвращает false, но это просто артефакт реализации.В другой реализации он может так же легко вернуть true или вызвать исключение во время выполнения.После того, как вы нарушили контракт на равенство, вы просто не знаете, как поведут себя другие объекты при столкновении с вашим объектом.
Однако, учитывая, что Javadoc говорит то, что он говорит, может показаться, чтоисправлено поведение, а не артефакт реализации.
Если его нет в javadoc или если javadoc не является частью спецификации, то он может измениться позднее, и код не будетбольше работать.