У нас есть OO-кодовая база, где во многих случаях hashcode()
и equals()
просто не работают, главным образом по следующей причине:
Невозможно расширить экземпляр класса и добавьте значение компонента при сохранении равных контракт, если вы не готовы отказаться от преимуществ объектно-ориентированного абстракция.
Вот цитата из "Эффективной Явы" Джошуа Блоха и там больше на эту тему в большой статье Артимы:
http://www.artima.com/lejava/articles/equality.html
И мы отлично справляемся с этим, это не тот вопрос, о котором идет речь.
Возникает вопрос: видно ли, что в каком-то случае вы не можете удовлетворить контракт equals()
, какой бы чистый способ автоматически сделать hashcode()
и equals()
бросить исключение UnsupportedOperationException?
Будет ли аннотация работать? Я думаю о чем-то вроде @NotNull
: каждое нарушение контракта @NotNull
делает автоматическое исключение, и вам больше нечего делать, кроме аннотирования ваших параметров/возвращаемого значения с помощью @NotNull
.
Это удобно, потому что это 8 символов ( "@NotNull" ) вместо постоянного повторения одного и того же кода проверки/исключения исключений.
В случае, о котором я беспокоюсь, в каждой реализации, где hashCode()/equals()
не имеет смысла, мы всегда повторяем одно и то же:
@Override
public int hashCode() {
throw new UnsupportedOperationException( "contract violation: calling hashCode() on such an object makes no sense" );
}
@Override
public boolean equals( Object o ) {
throw new UnsupportedOperationException( "contract violation: calling equals() on such an object makes no sense" );
}
Однако это ошибка: мы можем по ошибке забыть вырезать/вставить это, и это может привести к неправильному использованию пользователями таких объектов (скажем, пытаясь поместить их в коллекции Java по умолчанию).
Или если аннотации не могут быть созданы для создания такого поведения, будет ли AOP работать?
Интересно, что реальная проблема заключается в самом присутствии hashcode()
и equals()
в верхней части иерархии Java, которая просто не имеет смысла в некоторых случаях. Но тогда как мы справляемся с этой проблемой чисто?