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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленький тест, :) 
:(
    Опции темы
LSD
Дата 31.10.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(NotGonnaGetUs @  31.10.2006,  19:03 Найти цитируемый пост)
Так нарушение-то в Timestamp, а не Date.

Метод equals() в Timestamp работает как раз нормально. Его в принципе нельзя так определить, чтобы не нарушить контракт, т.к. в общем случае Timestamp не равен Date из-за наличия дополнительных полей. Я не спорю, что унаследовав класс и переопределив некоторые методы, можно нарушить контракт, но в данном случае это классы из одной и той же библиотеки.

Лично мне кажется более корректным сравнивать именно классы, т.е. как делает IDEA:
Код
public boolean equals(Object o)
{
  if(this == o)
    return true;
  if(o == null || getClass() != o.getClass())
    return false;
......
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
NotGonnaGetUs
Дата 1.11.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @  31.10.2006,  20:12 Найти цитируемый пост)
Метод equals() в Timestamp работает как раз нормально. Его в принципе нельзя так определить, чтобы не нарушить контракт, т.к. в общем случае Timestamp не равен Date из-за наличия дополнительных полей.


Нет никаких общих случаев. 
Если используется публичное наследование, то класс наследник должен удовлетворять _всем_ контрактам класса родителя по определению.
Спорить по этому поводу я даже не буду.

В данном случае на метод Equals класса Date накладываются 
1) контракты класса оbject - они были вами процитированы
2) контракт класса Date (getTime = anotherDate.getTime)
В итоге контракт метода equals в классе Date является более _строгим_, чем у object. Никаких нарушений нет.

Класс Timestamp не выполняет контракт родителя, поэтому 
а) либо нужно не трогать Equals и добавить специальный метод сравнения только с timestamp
б) заменить наследование делегированием (единственной формой не паблик наследования в java).
Всё.

Цитата(LSD @  31.10.2006,  20:12 Найти цитируемый пост)
Я не спорю, что унаследовав класс и переопределив некоторые методы, можно нарушить контракт, но в данном случае это классы из одной и той же библиотеки.

Смысл данной фразы ускользает от меня в заоблочные дали.
Нарушать контракт НЕЛЬЗЯ ни в каком случае, независимо от того в каких библиотеках находятся классы.
А если такое произошло, то винить нужно не класс родитель, а программиста выбравшего его в качестве такового.


Код, который создаёт IDEA для метода equals, удобен в одних случаях, но не удобен в других.
Н-р:
Код

interface X { ... }
interface Y { ... }
interface Z { ... }

class A implements X,  Y {
    ...
}

class B implements X, Z {
   ...
}

class EvilAbstraction {
   public X strangePatternMatching(List<X> stuff, X pattern) {
        for(X x : stuff) {
             if (pattern.Equals(x)) {
                   return x;
             }
        }
        return null;
   }
   ...
}


В конкретной задаче классы А и B, не смотря на разницу в типах (Z,Y), могут быть одинаковыми в смысле Х.
PM MAIL   Вверх
LSD
Дата 1.11.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(NotGonnaGetUs @  1.11.2006,  10:59 Найти цитируемый пост)
В данном случае на метод Equals класса Date накладываются 
1) контракты класса оbject - они были вами процитированы
2) контракт класса Date (getTime = anotherDate.getTime)
В итоге контракт метода equals в классе Date является более _строгим_, чем у object. Никаких нарушений нет.

Класс Timestamp не выполняет контракт родителя, поэтому 
а) либо нужно не трогать Equals и добавить специальный метод сравнения только с timestamp
б) заменить наследование делегированием (единственной формой не паблик наследования в java).
Всё.

А какой пункт контракта из перечисленных нарушен в Timestamp? У Timestamp контракт более строгий чем у Date, ситуация аналогична Object - Date.

Я считаю что наследник, не должен быть равен "родителю". Рассмотрим такую ситуацию, есть у нас класс Shape, и у него есть два наследника Rectangle и Ellipse. Если в Shape опртеделить equals() вот так:
Код
public abstract class Shape
{
  protected Point centre;

  @Override
  public boolean equals(Object o)
  {
    if(this == o)
      return true;
    if(!(o instanceof Shape))
      return false;
    Shape that = (Shape) o;
    return this.centre.equals(that.centre);
  }
}

а в наследниках сделать обработку случая сравнения с Shape, то из свойства транзитивности будет следовать:
Код
(ellipse.equals(shape) && shape.equals(rectangle)) => ellipse.equals(rectangle).

что вообще говоря "странно".

Цитата(NotGonnaGetUs @  1.11.2006,  10:59 Найти цитируемый пост)
Смысл данной фразы ускользает от меня в заоблочные дали.

Я имел в виду, что если мы унаследуем от некого класса, и своими модификациями нарушим контракт, то виноваты будем мы, а не разработчик исходного класса.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
NotGonnaGetUs
Дата 2.11.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @  1.11.2006,  13:25 Найти цитируемый пост)
А какой пункт контракта из перечисленных нарушен в Timestamp? У Timestamp контракт более строгий чем у Date, ситуация аналогична Object - Date


Ну давайте устроим спор из разряда "в java всё передаётся по значению или по ссылке?".

Метод Equals у класса Timestamp правильно переопределяет метод Equals класса Object, но при этом нарушает контракт класса Date.
Если бы это было не так, то не было бы нарушения A.Equals(B)==B.Equals(A).

Если бы реализация метода Equals в Date была другая, то проблемы могло бы и не возникнуть, но поскольку _сначала_ был создан класс Date и именно с такой реализацией данного метода, а _потом_ от него отнаследовали класс Timestamp, то ошибка ложится на плечи авторов класса Timestamp.
Разве это не очевидно?

Цитата(LSD @  1.11.2006,  13:25 Найти цитируемый пост)
Я считаю что наследник, не должен быть равен "родителю". Рассмотрим такую ситуацию, есть у нас класс Shape, и у него есть два наследника Rectangle и Ellipse. Если в Shape опртеделить equals() вот так:

Опять двадцать пять.
Именно из-за таких "я считаю", каждый метод должен снобжаться явным описанием того, что он делает (а не описанием как). 

Если семантика метода Equals у Shape такова, что он должен проверять фигуры на их геометрическое тождество, то на лицо ошибочная реализация. Данный метод должен быть abstract в shape. Но даже в этом случае: квадрат с прямоугольником как сравнивать будете? smile Нужно иметь ясное представление о том, что должен делать метод, преждем чем его создавать и уж тем более это важно при наследовании.

А если метода Equals предполагает сравнение центров фигур (такой у него контракт и ничего преступного тут нет), то всё в вашем примере работает просто замечательно: эллипс действительно будет равен прямоугольнику в этом смысле.

Цитата(LSD @  1.11.2006,  13:25 Найти цитируемый пост)
Я имел в виду, что если мы унаследуем от некого класса, и своими модификациями нарушим контракт, то виноваты будем мы, а не разработчик исходного класса. 

Вот и я о том же, разработчик Timestamp нарушил контракт исходного класса.

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



Позволю и себе задать маленький вопрос smile Нужно написать функцию которая принимает целое число и возращает результат целочисленого деления на 32. Нельзя использовать в тексте арабские  цифры и символы +, -, /, *, % и циклы. Чем короче, тем лучше


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
shimopus
Дата 11.11.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

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



Может сдвигать влево на 5??? 
PM ICQ Skype GTalk   Вверх
integral
Дата 11.11.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



так нельзя использовать арабские цифры (см. условие)


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
batigoal
Дата 11.11.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Пришло в голову вот такое решение, но без нуля я не обошелся:
Код

import java.io.InputStreamReader;
import java.io.BufferedReader;

public class HexTest {
    public static void main(String[] args) {
        try {
            InputStreamReader stdin = new InputStreamReader(System.in);
            BufferedReader console = new BufferedReader(stdin);
            System.out.print("Enter the number: ");
            int number = Integer.parseInt(console.readLine());
            System.out.println(number >> (0xF - 0xA));
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}




--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
shimopus
Дата 11.11.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

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



Код

x >>> Integer.parseInt("5")


Так тоже нельзя?
PM ICQ Skype GTalk   Вверх
integral
Дата 11.11.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



на так, не так нельзя, так как арабские цифры должны отсутствовать в коде

Добавлено @ 14:37 
2batigoal: операции -, +, *, / использоваит нельзя, а Вы использовали -, ну и 0 еще


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
shimopus
Дата 11.11.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

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



А так можно?
Код

x >>> ((int)'%' - (int)' '))

PM ICQ Skype GTalk   Вверх
LSD
Дата 11.11.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Можно извратится так:
Код
BigInteger i = new BigInteger("128");
BigInteger two = BigInteger.ONE.add(BigInteger.ONE);
BigInteger div = two.multiply(two).multiply(two).multiply(two).multiply(two);
System.out.println(i.divide(div));

Ну или получить 4 а потом сдвиг.

Добавлено @ 14:46 
Цитата(shimopus @  11.11.2006,  14:43 Найти цитируемый пост)
А так можно?

Тут есть минус, но в целом ход мысли верный. Надо только вычитание заменить сдвигом.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
batigoal
Дата 11.11.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Цитата(integral @  11.11.2006,  15:35 Найти цитируемый пост)
2batigoal: операции -, +, *, / использоваит нельзя,

Угу, точно, проморгал.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
integral
Дата 11.11.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.7.2006
Где: Dnipropetrovs' ;k, Ukraine

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



2LSD:   а в своем коде Вы использовали ар. цифры - а этого делать нельзя. 
2shimopus: Вы использовали минус - ай-ай-ай smile Но ход мысли действительно правильный. Но для этого нужно помнить коды символов, есть способ попроще;)


--------------------
import my.opinion.*;
жж
PM ICQ   Вверх
shimopus
Дата 11.11.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

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



Цитата(LSD @ 11.11.2006,  15:44)
Тут есть минус, но в целом ход мысли верный. Надо только вычитание заменить сдвигом.

Я уже думал над этим. Но для сдвига надо либо взять первое число очень большим, либо второе получить очень маленьким
PM ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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