2015-10-25 2 views
1

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

1) Создайте EqualsUtility, у которого есть куча перегруженных статических методов equals().

Задача: класс станет очень большим при расширении стороннего кода.

2) Создайте классы адаптера для всех сторонних классов и напишите метод equals.

Задача: Слишком много новых классов.

Есть ли третий, более чистый способ сделать это.

+0

Я не знаю, как это помогает, но в настоящее время я использую выбор-1. – ishan3243

ответ

2

Вы можете попытаться проверить равенство объекта с какой-либо третьей стороной lib, например, с ApacheCommoms EqualsBuilder. Но это может быть не очень хорошее решение, поскольку для сравнения используется отражение. Кроме того, это не помогает в реализации хеш-кода.

IMO, расширяющие базовые классы и переопределяющие равные и методы hashcode являются предпочтительными. Любое другое решение, включая аспекты, сторонние библиотеки для глубокого сопоставления объектов, некоторые прокси-объекты, не подходят для производительности, а в некоторых случаях и для понимания вашего кода.

+2

Действительно, таким образом вы можете использовать объекты в коллекциях и т. Д., Которые полагаются на equals/hashcode, которые работают правильно –

0

Отъезд AspectJ. Это ориентированная на ASP.NET библиотека программирования для Java, которая позволит вам делать именно то, что вы хотите сделать. Вы описываете объект, называемый pointcut, который примерно соответствует примерно в этом случае вызову метода equals() для объектов библиотеки.

Затем вы пишете код, который запускается при ударе этого pointcut. Вы можете писать разные типы pointcut. Так, например, вы можете выполнить свой код перед методом equals(), после метода equals() или вокруг метода equals(). Если вы пишете тип around(), вы можете выбрать обработку вызова самостоятельно или выполнить некоторую работу, а затем вызвать оригинальный метод.

Вы можете сделать round() и переписать метод equals, чтобы он был правильным для вашей ситуации.

Очень мощный материал.

Смежные вопросы