Когда вы в последний раз писали интерфейс в Java и для чего?

«Когда вы в последний раз писали интерфейс в Java и для чего?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интерфейс определяет контракт, который должны реализовать классы. Я использовал его на прошлой неделе для абстракции платежного сервиса.

Пример интерфейса PaymentProcessor:

public interface PaymentProcessor {
    /**
     * Обрабатывает платеж.
     * @throws PaymentException если платеж не прошел
     */
    PaymentResult processPayment(PaymentRequest request) throws PaymentException;

    /**
     * Выполняет возврат средств.
     * @throws RefundException если возврат невозможен
     */
    void refundPayment(String transactionId) throws RefundException;
}

Ключевые принципы, которые я применил:

  1. Единая ответственность (Single Responsibility): Интерфейс отвечает только за операции с платежами.
  2. Четкие имена методов: Имена (processPayment, refundPayment) точно описывают действие.
  3. Использование Checked Exceptions: Ошибки бизнес-логики (например, отклоненный платеж) объявлены явно, чтобы клиентский код был вынужден их обработать.
  4. Документация (JavaDoc): Описан контракт и условия возникновения исключений.

Практическое применение: Этот интерфейс был реализован классами-адаптерами для разных провайдеров (StripePaymentProcessor, PayPalPaymentProcessor), что позволило легко менять и тестировать платежные системы.