Как вставить в Long/String compareTo()?
У меня есть класс, реализующий структуру данных, хранящую сопоставимые объекты. Некоторые экземпляры содержат длинные и другие строки.
Я хочу посчитать количество выполненных сравнений, не меняя слишком много класса структуры данных или приложения.
Одна естественная идея состоит в том, чтобы реализовать новый класс (скажем, MyLong), которым compareTo() увеличивает некоторый счетчик статистики, а затем вызывает реальный compareTo(). Затем измените приложение, чтобы хранить MyLongs вместо Long и т. Д. Это не работает, потому что я не могу наследовать от Long или String.
Можно ли заставить этот подход работать? Есть ли другой способ достижения этой цели?
3 ответа
"предпочитаю композицию наследству"
Напишите новый класс MyLong, который реализует Comparable (и, возможно, расширяет Number) и содержит Long. Затем сделайте так, чтобы он передавал все вызовы на содержащийся Long, кроме тех, которые вы хотите инструментировать; для тех он увеличивает счетчик и передает их Long.
Вы можете сделать это довольно рано с AspectJ.
По сути, вы должны написать pointcut вокруг вашего метода CompareTo реализующего класса и добавить туда счетчик.
Если позволяют критерии вашего проекта, ваша структура данных может хранить объекты, которые реализуют интерфейс Comparator. Пользовательский компаратор может позволить вам подсчитать общее количество сравнений, выполненных с данным компаратором. Просто мысль.