Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Некорректная имплементация equals() 
:(
    Опции темы
fixxer
Дата 18.10.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Цитата(mindflyer @ 18.10.2007,  14:05)
Цитата(Shaggie @  18.10.2007,  10:34 Найти цитируемый пост)
Ээй, хватит! Так вы на этом участке скоро и OutOfMemoryException перехватывать будете!
А Null успешно ловится на проверке instanceof, так что это, право, лишнее. 

В данном случае проверка необходима. instanceof делается для сравниваемого объекта, я же написал о равенству null поля объекта.

И? В данном случае методы this.name не вызываются и NPE не случится. Все корректно отработает.


--------------------
user posted image
PM MAIL ICQ   Вверх
mindflyer
Дата 18.10.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 1
Всего: 4



fixxer, Shaggie, для тех, кто не боится NPE:
Код

public class Test {
    private String name;
    public Test(String name) {
        this.name = name;
    }
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Test)) return false;
        Test t = (Test)obj;
        return t.name.equals(this.name);
    }
    public static void main(String[] args) {
        Test t1 = new Test("");
        Test t2 = new Test(null);
        System.out.println(t2.equals(t1));
        System.out.println(t1.equals(t2));
    }
}

PM MAIL ICQ   Вверх
fixxer
Дата 18.10.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Согласен.


--------------------
user posted image
PM MAIL ICQ   Вверх
Royan
Дата 18.10.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Shaggie, Ты скажи, что пытаешься доказать? Что такой класс есть JavaAPI? Такого класса там нет! То что на сановых форумах поиск выводит OutOfMemoryException то это только лишь от того что многие его участники забывают, что OutOfMemory бывает только Error и пишут по привычке Exception


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
chief39
Дата 18.10.2007, 17:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Код

public class MyClass{

private String str;

public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyClass tmp = (MyClass) o;
        return !(str != null ? !str.equals(tmp.str) : tmp.str != null);

    }
}


Разница в инстансоф и сравнении по getClass ну и.... нуллы - э то нуллы. Они есть и будут есть. Зачем такой абстрактный иквалз нужен?
Сферический конь в вакууме или принцесса, которая не какает.



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
mindflyer
Дата 19.10.2007, 08:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 1
Всего: 4



Цитата(chief39 @  18.10.2007,  17:55 Найти цитируемый пост)
Разница в инстансоф и сравнении по getClass

Точно!  smile 
Во тема, блин smile 
Вопрос не по теме, но зачем сделано через отрицания в "return !(str != null ? !str.equals(tmp.str) : tmp.str != null);"? Исходя из каких-то соображений?

PM MAIL ICQ   Вверх
jsse
Дата 19.10.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 1.5.2006
Где: Кривой Рог

Репутация: нет
Всего: 2



(offtopic) нигилизм наверное )

Добавлено @ 09:29
Если уже сильно нада сравнить, то я бы сделал так:

Код

public class MyClass {

    private String str;

    public String getString() {
          return str;
    }

    public boolean equals(Object o) {
        boolean ret = false;
        try {
            ((MyClass)o).equals(this); // если null, ClassCastException
            .... // OutOfMemoryError и т. д.
            if(str.equals(((MyClass)o).getString())) {
                 ret = true;
            }
        } catch (Exception e) {...}
        return ret;
    }
}


Это сообщение отредактировал(а) jsse - 19.10.2007, 09:30
PM WWW Skype   Вверх
Shaggie
Дата 19.10.2007, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



Royan, ок, принято. Свою ошибку признаю. Дома потестил - в самом деле Error вылетает, так что невнимательность на мне.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
mindflyer
Дата 19.10.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 1
Всего: 4



Цитата(jsse @  19.10.2007,  09:16 Найти цитируемый пост)
Если уже сильно нада сравнить, то я бы сделал так:

Механизм exception работает очень медленно по сравнению с обычными проверками (if, instanceof,...), не знаю какова разница в современной java, но про 1.4 видел в литературе высказывание о простых случаях (как рассматриваемый в этом топике) - "в десятки раз медленнее".

Это сообщение отредактировал(а) mindflyer - 19.10.2007, 11:14
PM MAIL ICQ   Вверх
jsse
Дата 19.10.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 1.5.2006
Где: Кривой Рог

Репутация: нет
Всего: 2



mindflyer, я описал ситуацию если нужно очень получить ответ, но не скорость выполнения ), хотя было бы интересно узнать факты и примеры где Exсeption отрабатует "в десятки раз медленнее"!
PM WWW Skype   Вверх
chief39
Дата 19.10.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(mindflyer @  19.10.2007,  08:57 Найти цитируемый пост)
Вопрос не по теме, но зачем сделано через отрицания в "return !(str != null ? !str.equals(tmp.str) : tmp.str != null);"? Исходя из каких-то соображений?

Оптимизейшн. smile IDE предложила соптимизнуть - я согласился smile Было длиннее.

Цитата(mindflyer @  19.10.2007,  11:11 Найти цитируемый пост)

Механизм exception работает очень медленно по сравнению с обычными проверками (if, instanceof,...), не знаю какова разница в современной java, но про 1.4 видел в литературе высказывание о простых случаях (как рассматриваемый в этом топике) - "в десятки раз медленнее".

Вообще, эксепшн - это когда идёт что-то не так по нашей или чужой вине. "Соломка подстеленная на всякий случай".
А управление нормальным ходом программы с помощьюэксепшнов - плохой стиль.
Всё равно как вместо
if(obj == null){
  <blah-blah>
}

писать
try{
if(obj.getName == "ewe")
}catch(NullPointerException e){
  <blah-blah>
}
Суть ни капли не меняется, но читать удобнее и правильнее


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
jsse
Дата 19.10.2007, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 1.5.2006
Где: Кривой Рог

Репутация: нет
Всего: 2



chief39, еще хуже стиль когда в каждом сравнении типа if идет return
PM WWW Skype   Вверх
chief39
Дата 19.10.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Цитата(jsse @  19.10.2007,  11:56 Найти цитируемый пост)
chief39, еще хуже стиль когда в каждом сравнении типа if идет return 

То есть?
Типа:
return x!=5;
да?

А что тут хуже? В том, что сразу "разбираются" тупиковые ветки алгоритма и бесповоротно "отсекаются" ретурнами? Для того, чтоб в конце блока случайно не наткнуться на давно забытое в начале.

То бишь, есть претензии по варианту с несколькими ретурнами? smile
Можно пояснить свою личную точку зрения? smile


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
jsse
Дата 19.10.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 1.5.2006
Где: Кривой Рог

Репутация: нет
Всего: 2



chief39, обычно код одной ф-ции не занимает 5 строк ) Например сложно будет читать код в котором 10 return на 20 строк кода.

Это сообщение отредактировал(а) jsse - 19.10.2007, 12:12
PM WWW Skype   Вверх
Shaggie
Дата 19.10.2007, 12:36 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



Цитата(jsse @  19.10.2007,  13:11 Найти цитируемый пост)
обычно код одной ф-ции не занимает 5 строк ) Например сложно будет читать код в котором 10 return на 20 строк кода

Ща пофантазирую... 10 return - это 10 различных (!) ситуаций, из-за которых выполнение функции может завершиться досрочно. Причём не все они выбрасывают исключение. Значит, надо для отслеживания некоторых ситуаций писать собственные исключения.

Если мы вместо 10 возвратов используем один большой трай-кетч блок, то сразу потеряем возможность отслежить причину выброшенного исключения, чтобы соответствующим образом отреагировать.

А если используем 10 разных трай-кетч блоков, причём вложим их так, чтобы при вылетании исключения выполнение метода завершалось с нужным нам результатом, то можно будет в паспорте в графе "национальность" вписывать "индус".

Предпочитаю честные возвраты.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.