какие причины использовать интерфейсы (Java EE или Spring и JPA) - PullRequest
4 голосов
/ 17 января 2012

Большинство классов ее2ее (spring и JPA) разработаны с интерфейсами. кроме наследования есть ли какие-либо технические причины ??как Dynaimc прокси или AOP, мне нужно больше технических подробностей об этом

ex

public interface UserDAO {
   void delete();
   void update();
   void save();
   List<User> get();
}

public class UserDAOImpl implements UserDAO {
   public void delete(){}
   public void update(){}
   public void save(){}
   public List<User> get(){}
}

Ответы [ 3 ]

21 голосов
/ 17 января 2012

Существует 3 основных причины, IMO:

Первая причина: прокси.

Если вы запросите Spring для bean-компонента типа UserDAO, он фактически вернет прокси, инкапсулирующий фактический UserDAOImpl.пример.Это позволяет ему разграничивать транзакции, проверять авторизацию безопасности, доступ к журналу, вычислять статистику и т. Д. Это можно сделать без интерфейса, но тогда потребуется манипулирование байт-кодом.

Вторые причины: тестируемость.

При модульном тестировании бизнес-службы, которая использует UserDAO, вы обычно внедряете фиктивную реализацию UserDAO.Еще раз, это легче сделать, когда UserDAO является интерфейсом.Это возможно с конкретным классом, но это не всегда было так, и все еще проще с интерфейсом

Третья причина: разделение.

Используя интерфейс, у вас есть место, где вы определяетереальный контракт DAO для своих клиентов.Конечно, ему нужен метод setDataSource() в конкретной реализации, но клиенты не заботятся об этом.Все, что им нужно, - это набор методов доступа к данным, предлагаемых DAO.Разделяя интерфейс и конкретную реализацию, вы убедитесь, что клиент не полагается на детали реализации DAO.

7 голосов
/ 17 января 2012
  1. Интерфейсы для одного являются контрактами, как я их вижу. Например, набор разработчиков программного обеспечения (классы реализации) может иметь конкретный контракт с компанией (интерфейс). Компания может выбирать между инженерами время от времени в зависимости от потребностей проекта. Поскольку они заключают один и тот же договор и следуют одним и тем же правилам, переключение проще, чем привлечение ресурса извне (написание нового класса) каждый раз, когда проект нуждается в изменении. Вам просто нужно изменить конфигурации для переключения классов реализации.

  2. Интерфейсы чистые и представляют собой единый доступ к правилам, которые реализуют классы.

Ссылки

  1. пружина и интерфейсы
  2. Что значит «программировать на интерфейс»?
  3. http://www.artima.com/lejava/articles/designprinciples.html
5 голосов
/ 17 января 2012

Поскольку вы упомянули Spring explicite.

Spring AOP можно использовать в разных конфигурациях.По умолчанию используется динамический прокси Java ( java.lang.reflect.Proxy ).Это может быть применено только к интерфейсам

Spring AOP по умолчанию использует стандартные динамические прокси J2SE для прокси AOP.Это позволяет проксировать любой интерфейс (или набор интерфейсов).

@ see Spring Reference Глава 7.1.3 Прокси-серверы AOP @see Динамические прокси-классы

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