К чему создаётся интерфейс для сервис-класса?
Используя фреймворки Spring, принято для создания сервиса создать интерфейс определяющий основные методы сервиса.
interface MultiplicationService {
long execute(int a, int b);
}
class MultiplicationServiceImpl implements MultiplicationService {
// implementation
}
В чём смысл создания интерфейса?
Ответы (3 шт):
Во-первых, как заметили в чате, это упращает тестирование. Меньшая связность позволяет легко поменять реализацию.
А во-вторых, в спринге можно инжектить бины по интерфейсу так же, как и обычные pojo классы (но требуется, чтобы спринг мог однозначно определить какой бин следует инжектить, иначе - кинет исключение). В этом плане смысл такой же как и в java core.
Если имплементация сервиса одна и только одна и в будущем не планируется других реализаций, то можно и не париться по поводу интерфейса.
Главное не попасть в ситуацию когда мы сделали сервис без интерфейса, а потом резко захотели сделать еще одну и добавили интерфейс. Вот в этом случае может измениться поведение, так как интерфейсные сервисы поднимаются через прокси.
Более глубокое копание в этом направлении можно почитать тут.
По этому многие просто используют правило - не хочешь неожиданностей в будущем - делай интерфейс :)
Весь смысл в полиморфизме. Ваш интерфейс можно реализовать по разному. Но для того, чтобы не писать одно и то же в каждом классе, название методов выносят в интерфесй. А затем реализуют их так, как нужно в каждом из случаем.