B>>>interface TimeListener { B>>> /** Means that onTimeout() should be invoked one time in returned period in seconds. */ B>>> int getFrequency(); B>>> void onTimeout(); B>>>}
B>Т.е. джавадок на метод интерфейса это просто 'комментарий'? Дизайн чего здесь не продуман?
На мой взгляд, вы вынесли из класса часть логики, которой место в классе. У вас проверка наступления события происходит не в классе, реализующем TimeListener. Ваш дизайн не позволит произвольно переписать логику определения момента наступления события. getFrequency() перекладывает на клиента необходимость отслеживания наступления события.
Вы не можете клиента заставить вызывать onTimeout() в нужный момент, используя средства языка. Поэтому вы начинаете городить огород с комментарием. Да, javadoc — это всего лишь комментарий. Он ни к чему не обязывает. В итоге у вас часть внутреннего состояния дублируется (сам объект значет, как часто его надо вызывать, но вот количество тактов у вас для каждого объекта храниться во внешнем по отношению к класу хранилище).
Я бы такой дизайн не принял.
А вот за это двойку в дневник и родителей в школу. Это называется: "интерфейс я ввел, но продумывать модель исключений мне лень".
Здравствуйте, bolshik, Вы писали:
B>Здравствуйте, Георгий Вячеславович, Вы писали:
B>Можно проще. А можно правильнее, хотя правильность — понятие относительное.
Чем больше кода, тем больше места для ошибок. Вот здесь
Здравствуйте, Георгий Вячеславович, Вы писали:
ГВ>В итоге у вас часть внутреннего состояния дублируется (сам объект значет, как часто его надо вызывать, но вот количество тактов у вас для каждого объекта храниться во внешнем по отношению к класу хранилище).
Здравствуйте, Георгий Вячеславович, Вы писали:
ГВ>На мой взгляд, вы вынесли из класса часть логики, которой место в классе. У вас проверка наступления события происходит не в классе, реализующем TimeListener. Ваш дизайн не позволит произвольно переписать логику определения момента наступления события. getFrequency() перекладывает на клиента необходимость отслеживания наступления события.
В таком виде контракт интерфейса понятен?
/**
* Represents an object that is interested in timer service. An object should
* provide timer with the information about interested frequency. Timer service
* should notify the object with the specified frequency.
*/interface TimeListener {
/**
* @return interested frequency(1 time per returned number of seconds).
*/int getFrequency();
/**
* Is called by the timer service whith the specified frequency.
*/void onTimeout();
}
ГВ>Вы не можете клиента заставить вызывать onTimeout() в нужный момент, используя средства языка. Поэтому вы начинаете городить огород с комментарием. Да, javadoc — это всего лишь комментарий. Он ни к чему не обязывает. В итоге у вас часть внутреннего состояния дублируется (сам объект значет, как часто его надо вызывать, но вот количество тактов у вас для каждого объекта храниться во внешнем по отношению к класу хранилище).
ГВ>>Вот это беру назад. Не совсем это имел ввиду.
Ок
ГВ>Я бы такой дизайн не принял.
На здоровье.
ГВ>А вот за это двойку в дневник и родителей в школу. Это называется: "интерфейс я ввел, но продумывать модель исключений мне лень". ГВ>
Угу, это значит, что когда я выставляю MyTimer на всеобщее пользование и к нему, допустим, подключаются десять клиентов с нормальной имплементацией TimerListener, а потом подключается одиннадцатый, у которого интерфейс реализован как
public void onTimeout() {
throw new RuntimeException("Just for fun");
}
Здравствуйте, bolshik, Вы писали:
B>В таком виде контракт интерфейса понятен?
Он был понятен и в первом варианте. Я не о понятности говорил.
B>Угу, это значит, что когда я выставляю MyTimer на всеобщее пользование и к нему, допустим, подключаются десять клиентов с нормальной имплементацией TimerListener, а потом подключается одиннадцатый, у которого интерфейс реализован как
B>
B>public void onTimeout() {
B> throw new RuntimeException("Just for fun");
B>}
B>
B>то сервис должен отказать?
А если такой код:
public void onTimeout() {
throw new OutOfMemoryError();
}
На мой взгляд, задача таймера — отсчитывать. Задача наблюдателя — реагировать. На каждый отсчет или через один — это дело наблюдателя, а не таймера. Каковы плюсы от реализации подсчета количества тактов в таймере?
P.S. Кроме того, задача на тему wait/notify. Хотя в условии и этого не сказанно.