Обеспечение одинакового поведения разных конструкторов в Java - PullRequest
1 голос
/ 07 марта 2012

Я был на собеседовании на прошлой неделе, и один из вопросов в тесте по программированию был: «Как вы можете гарантировать, что разные конструкторы в классе ведут себя одинаково в Java?Я не был и до сих пор не уверен, что означает «иметь такое же поведение».Ответ, который я дал, был:

    

    (new MyObject(...)).equals(new MyObject(...));
    (new MyObject(...)).hashCode == (new MyObject(...)).hashCode();

Здесь в каждой строке первый MyObject (...) ссылается на один конструктор, а второй - на другой.

Как вы думаете, что на самом деле задавали вопросы?

Ответы [ 4 ]

4 голосов
/ 07 марта 2012

Я не считаю ваш ответ правильным. Вы только доказываете, что два объекта равны (кстати, если объекты равны, они должны иметь одинаковые hashCode(), второе сравнение избыточно).

Я думаю, что правильное решение состоит в том, чтобы иметь один первичный конструктор и делегировать ему все остальные конструкторы, вызывая this(...). Если все неосновные конструкторы настолько коротки, насколько это возможно, скорее всего, все они будут вести себя одинаково, поскольку все они делегируют один и тот же код.

И, конечно, юнит-тестирование также могло быть правильным ответом.

1 голос
/ 07 марта 2012

Я думаю, это было связано с использованием this() и super().

0 голосов
/ 07 марта 2012

В случае, если классы, на которые вы ссылаетесь, не переопределяют данные методы, равные по-прежнему будут ложными, поскольку это два разных объекта (их детали выделения памяти различны).Хеш-код также не будет работать.

Я думаю, что вы можете написать кусок кода, который пересекает классы, используя отражение, и проверяет для каждого поля, что оно имеет одинаковое значение.В конце эти два экземпляра отличаются только по полям (но не по методам, так как они установлены во время компиляции).

Удачи на следующем собеседовании.

0 голосов
/ 07 марта 2012

Это зависит от того, как вы определяете equals и хэш-код

, например (худший!) Рассмотрите следующую реализацию equals()

return true;

и hashcode()

return 1;

теперь даже не имеет значения, в каком состоянии находится объект!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...