Код - как код... умеренной кривизны. Тянет из какой-то БД параметры (таймаут и количество попыток), откладывает в Мэп некие статусы по ключу IP+Пользователь, и позволяет опрашивать их состояние (не вышел ли таймаут и не исчерпано ли заданное количество попыток) / удалять / сбрасывать... короче, очень похоже на кусок какой-то хрени для рассылки спама.
Что
конкретно непонятно в этом коде?
Спрашивайте!.. не думаю, что кто-нибудь станет просто так комментировать каждую строчку этой простыни без конкретной постановки вопроса :)
Update:
@gurinderu Прикольно, а откуда инфа про базу данных? )))))))
@Losted По DataBaseException, полагаю
Именно... эта exception может прилететь только из
getOption(). А в остальном все просто, как угол дома. Некая сущность создает экземпляр этого класса, передавая в конструктор контроллер, из которого при инициализации потянутся начальные "настройки". Т.к. метод
synchronize() публичный, очевидно, данные в "базе" могут поменяться на лету, и его можно дернуть еще раз, чтоб перезачитать актуальные настройки. (Действительно ли за этим скрывается БД или что-то другое, сказать невозможно - детали абстрагированы фасадом
SysOptionController.)
Т.к. этот и др. публичные методы
synchronized, очевидно, они могут дергаться разными потоками. (Кстати, синхронизация сделана довольно таки криво и может обернуться проблемами производительности... но это уже другая тема).
Отсюда более-менее понятно, что делает эта некая сущность. Скорее всего, она предназначена для выполнения какого-то действия с "пользователями" (например, отправки им спама), которое может сработать с первого раза, а может и не сработать. На обработку одного пользователя отводится лимит времени и попыток. Пользователь идентифицируется по IP и имени. Скорее всего, там есть некий
ЕхecutionService с пулом потоков. Поток получает экземпляр
BFController и, в зависимости от того, что он делает, может воспользоваться соотв. методами:
addTry() - когда начинается очередная "попытка"
needWait() - чтоб проверить, продолжать ли попытки или лимит для пользователя исчерпан
resetTries() - чтоб сбросить счетчик попыток.
Помимо кривой синхронизации, семантика публичного интерфейса мутная, базируется на неких неочевидных предположениях об использовании класса и, вдобавок, реализация никак не очищает память. Короче, с т.з. объектного дизайна - уверенная троечка с плюсом :)