2015-03-05 3 views
1

У меня есть интерфейс, как такJava Дизайн интерфейса - Методы Helper

public interface Manager { 
    public void manage(); 
} 

Теперь все Manager ей нужно будет загрузить работу по управлению, однако, у меня смешанные чувства по поводу добавления public void loadWork() к интерфейсу ...

С одной стороны, все Manager s будут делать это, но с другой стороны, пользователи класса Manager не нуждаются в информации о loadWork().

Вопрос: Неправильная практика заключается в добавлении методов «помощник» или «настройка» к интерфейсу?

+0

Что мешает вам добавить их в другой интерфейс? –

+0

Вы имеете в виду отдельный интерфейс, скажем, 'WorkLoader', который делает это, и каждый' Manager' имеет 'WorkLoader'? Если это так, похоже, это только сдвигает проблему. Как заставить «Менеджер» иметь «WorkLoader»? Или я должен? – user2205316

+0

Вам не обязательно. Когда вы реализуете интерфейс 'Manager', вы также можете реализовать интерфейс WorkLoader. –

ответ

1

Не всегда плохая идея добавлять «установочные» методы в интерфейс. Например, Java EE имеет интерфейс под названием ServletContextListener, который предназначен исключительно для настройки и закрытия. Даже иногда бывает приемлемо создавать интерфейсы с методами, которые вы фактически никогда не должны называть напрямую, например, Runnable или интерфейс Callable.

Говорят, что вы хотите заставить своих разработчиков реализовать метод loadWork() в Менеджере, но вы также хотите скрыть его от пользователей класса. Как вы говорите, одна опция добавляет метод в интерфейс, но таким образом метод будет доступен (чего вы не хотите). Если вы не хотите, способ иметь видимость Я вижу два варианта:

  1. Сделать класс менеджер абстрактный класс и добавить loadWork() защищенный метод.
  2. Создайте интерфейс под названием LoadWorker по методу loadWork(). Затем создайте абстрактный класс AbstractManager, который реализует Менеджер и имеет в качестве частного/защищенного LoadWorker. Таким образом, хотя loadWork() является общедоступным, он недоступен с пользователей AbstractManager, так как он называется через защищенное/закрытое поле (LoadWorker).

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

+0

Спасибо! Да, я рассматривал кое-что по очереди второго, но надеялся избежать использования абстрактного класса. Думаю, я попытаюсь использовать этот подход. Также, отличные примеры с 'Callable' /' Runnable'. – user2205316

Смежные вопросы