Как расширять функционал существующего API в Java?

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

Ответ

Расширение API — частая задача. Главные принципы: обратная совместимость (backward compatibility) и минимальное воздействие на существующих клиентов.

Основные подходы:

  1. Добавление default-методов в интерфейсы (Java 8+):

    public interface PaymentService {
        // Старый метод
        void processPayment(double amount);
    
        // Новый метод с безопасной default-реализацией
        default void refundPayment(double amount, String reason) {
            throw new UnsupportedOperationException("Refund operation is not yet supported");
        }
    }

    Существующие реализации не требуют изменений, а новые могут переопределить метод.

  2. Создание нового интерфейса, наследующего старый:

    public interface ExtendedPaymentService extends PaymentService {
        void refundPayment(double amount, String reason);
    }
  3. Добавление новых endpoint-ов в REST API:

    • Создание новых методов в контроллере с новыми URL (/api/v1/users/{id}/profile).
    • Использование версионирования API (/api/v2/users).
  4. Использование SPI (Service Provider Interface): Позволяет создавать плагинные системы, где новые реализации регистрируются динамически.

Ключевые моменты:

  • Избегайте изменения сигнатур существующих публичных методов.
  • Всегда документируйте новые возможности.
  • Используйте депрекацию (аннотацию @Deprecated) для устаревающих методов с указанием альтернатив.