Простой ответ - иметь интерфейс со всеми обычными операциями, который также включает метод stop ().
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
stop();
}
Основная проблема с методом остановки заключается в том, что большинство клиентов, которые получают ссылку на Сервис, вероятно, также не смогут остановить сервис.
Другой альтернативой является простое определение двух интерфейсов: службы и Stoppable
interface Service {
operation( parameters ...);
somethingElse( parameters ... );
}
interface Stoppable {
void stop();
}
Единственная проблема этого подхода - если реализация обернута другой службой, тогда метод stopскрыто.
Первоначальная проблема, состоящая в том, чтобы не дать клиентам «остановить» вашу службу, все еще возможна, им просто нужно сначала проверить, является ли ссылка экземпляром Stoppable, а затем они могут «остановить» ее.*
Как бы вы решили эту проблему?
У меня есть идея, которая решает проблему элегантно (хорошо для меня), не оставляя доступной общественную остановку.Однако, прежде чем я покажу это, я хотел бы кое-какие идеи.