как мне вставить Long/String compareTo()?

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

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

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

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


person Adam Morrison    schedule 23.08.2011    source источник


Ответы (3)


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

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

person DJClayworth    schedule 23.08.2011

Вы могли бы сделать это довольно рано с помощью AspectJ.

Вы бы в основном написали pointcut вокруг вашего метода compareTo реализующего класса и добавили бы туда счетчик.

person Kal    schedule 23.08.2011

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

person Nadir Muzaffar    schedule 23.08.2011