1. Java / Говнокод #11533

    +74

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    @Override
    public boolean equals(Object obj) {
        boolean answer = false;
        if (obj instanceof Date) {
            Date d = (Date)obj;
            answer = (this.value.equals(d));
        } else if (obj instanceof String) {
            Date d = parse((String)obj);
            answer = (this.value.equals(d));
        } else if (obj instanceof Calendar) {
            Calendar c = (Calendar)obj;
            answer = (this.value.equals(c.getTime()));
        } else if (obj instanceof AtomDate) {
            Date d = ((AtomDate)obj).value;
            answer = (this.value.equals(d));
        }   
        return answer;
    }

    Симметрия отношения эквивалентности? Не, не слышал.

    Запостил: roman-kashitsyn, 05 Августа 2012

    Комментарии (17) RSS

    • Возможно, я неправильно понимаю, но в данном случае речь идет о равенстве, а не об эквивалентности. Эквивалентность в терминах Java - это когда имеем один и тот же объект, доступный под разными именами, а метод equals именно для того и переопределяется, чтобы получить равенство (насколько я знаю, по умолчанию он сравнивает объекты по ссылке, т.е. проверяет эквивалентность). Если бы мы хотели все время проверять только эквивалентность, то достаточно было бы одного оператора сравнения (по ссылке).
      Ответить
      • http://tinyurl.com/eq-wiki
        Метод equals по сути задаёт отношение эквивалентности для объектов. Законы, которым он должен подчиняться, спрашивают на всех собеседованиях по java. У блоха это тоже описано довольно детально.

        Проблема в данном случае в том, что нарушена симметрия: АтомДата может равняться строке (дате, календарю), но строка никогда не будет равна АтомДате.
        Ответить
        • Хорошо, я понял.

          Тогда вопрос: если equals в Java - эквивалентность, то как правильно проверять равенство?
          Ответить
          • Все, вопрос снят - я жоско протупил. == сравнивает по ссылке, equals делает именно то, о чем я спросил.
            Ответить
    • Я не виноватый, оно само так скопипастилось.
      http://svn.apache.org/repos/asf/abdera/java/trunk/core/src/main/java/org/apache/abdera/model/AtomDate.java
      Ответить
      • я понял, что это не твой код (как минимум по обилию комментов)
        я бы просто не стал ради одного формата даты yyyy-MM-dd'T'hh:mm:ss.SSS'Z' тянуть чей-то кривой сорец
        Ответить
        • Кстати, а стандартный джавовский Date такой формат не умеет парсить\выводить?
          Ответить
          • http://ideone.com/rT4Vz
            Ответить
            • Хм... а для чего тогда нужен AtomDate?
              Ответить
            • SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'")


              Выдаёт неправильное время ;-) На моей машине разница с реальностью 8 часов
              Ответить
              • SimpleDateFormat atomFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'");
                atomFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
                Вот так должен правильно выдавать
                Ответить
                • Этот выдаёт 2012-08-05T02:46:43.795Z
                  AtomDate выдаёт 2012-08-05T14:46:43.795Z

                  И прав AtomDate. Доктор, я умру?
                  Ответить
                  • Нет, просто кое-кто, не будем показывать на него пальцем, в своем примере поюзал hh вместо HH ;) Бывает ;)

                    Вот так вроде все ок: "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
                    Ответить
                    • ага, он в AM\PM показывал :)
                      заглючило меня, но AtomDate таки не нужен
                      Ответить
                      • > но AtomDate таки не нужен
                        Ну теперь, я думаю, и rat4 согласится с этим.
                        Ответить

    Добавить комментарий