Может ли интерфейс в Java содержать private метод с реализацией?

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

Ответ

Да, начиная с Java 9.

private методы в интерфейсах позволяют выносить общую логику из default методов, избегая дублирования кода внутри интерфейса.

Пример:

public interface DataProcessor {
    default void processData(String data) {
        validate(data);
        System.out.println("Processing: " + transform(data));
    }

    default void logAndProcess(String data) {
        validate(data);
        System.out.println("Logging...");
        System.out.println("Processing: " + transform(data));
    }

    // Private метод с реализацией для устранения дублирования
    private void validate(String data) {
        if (data == null || data.isEmpty()) {
            throw new IllegalArgumentException("Data cannot be empty");
        }
    }

    // Private статический метод также возможен
    private static String transform(String input) {
        return input.trim().toUpperCase();
    }
}

Ключевые ограничения:

  • Могут быть как статическими, так и нестатическими.
  • Не могут быть abstract — всегда должны иметь тело (реализацию).
  • Видимость строго ограничена интерфейсом: недоступны для классов, реализующих интерфейс, и других интерфейсов.
  • Основная цель — рефакторинг и организация кода внутри самого интерфейса.