Каков подходящий способ / шаблон для сбора информации из классов? - PullRequest
0 голосов
/ 15 марта 2010

Для упрощения, скажем, у меня есть интерфейс RandomProvider интерфейс

public interface RandomProvider
{
    double nextRandom();
}

И, скажем, у меня есть 3 различных реализации этого интерфейса: ARandom, BRandom, CRandom. Я хочу собрать немного статистики о реализации:

  • сколько раз nextRandom() называется
  • сумма сгенерированных случайных чисел (это может звучать глупо, но это только пример).

В конце эта статистика будет записана в БД. Это интенсивно используемые классы из нескольких потоков, поэтому невозможно писать значения каждый раз, когда приходит запрос.

Первая идея, которая приходит мне в голову: я создаю синглтон, который содержит эти данные, реализации вызывают синглтон и увеличивают необходимую статистику. Другой класс читает из синглтона и записывает результаты в БД и уменьшает статистику. Но я прочитал так много статей о том, насколько злы глобально изменяемые данные и синглтоны, поэтому я боюсь идти по этому пути.

Есть еще идеи?

Ответы [ 2 ]

2 голосов
/ 15 марта 2010

Вы можете использовать AOP для записи всех вызовов этого конкретного метода. Проверьте AspectJ . По сути, вы собираетесь перехватывать все вызовы, используя рекомендации «вокруг», собирать статистику и выполнять свои пользовательские операции (добавляя случайное число в данном случае). Затем сохраните это в БД.

2 голосов
/ 15 марта 2010

Да, синглтон может быть злой идеей, однако это зависит от их использования. Если вы используете singleton только для того, чтобы ваш код работал (позволяя ему затрагивать другие классы, такие как глобальный центральный объект), тогда это плохо.

Но, в конечном счете, вы просто ищете какой-то способ записи информации (регистратор), и в этом случае неплохо использовать синглтон для записи этих данных или даже для записи в некоторые текстовые / журнальные файлы. 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...