Как вставить в Long/String compareTo()?

У меня есть класс, реализующий структуру данных, хранящую сопоставимые объекты. Некоторые экземпляры содержат длинные и другие строки.

Я хочу посчитать количество выполненных сравнений, не меняя слишком много класса структуры данных или приложения.

Одна естественная идея состоит в том, чтобы реализовать новый класс (скажем, MyLong), которым compareTo() увеличивает некоторый счетчик статистики, а затем вызывает реальный compareTo(). Затем измените приложение, чтобы хранить MyLongs вместо Long и т. Д. Это не работает, потому что я не могу наследовать от Long или String.

Можно ли заставить этот подход работать? Есть ли другой способ достижения этой цели?

3 ответа

Решение

"предпочитаю композицию наследству"

Напишите новый класс MyLong, который реализует Comparable (и, возможно, расширяет Number) и содержит Long. Затем сделайте так, чтобы он передавал все вызовы на содержащийся Long, кроме тех, которые вы хотите инструментировать; для тех он увеличивает счетчик и передает их Long.

Вы можете сделать это довольно рано с AspectJ.

По сути, вы должны написать pointcut вокруг вашего метода CompareTo реализующего класса и добавить туда счетчик.

Если позволяют критерии вашего проекта, ваша структура данных может хранить объекты, которые реализуют интерфейс Comparator. Пользовательский компаратор может позволить вам подсчитать общее количество сравнений, выполненных с данным компаратором. Просто мысль.

Другие вопросы по тегам