Может ли метод функционального интерфейса в Java быть приватным?

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

Ответ

Нет, не может. Функциональный интерфейс должен содержать ровно один абстрактный метод (SAM — Single Abstract Method). Согласно спецификации Java, этот метод должен быть публичным — явно или неявно. Приватный метод не удовлетворяет этому требованию, так как он не виден за пределами интерфейса.

Пример ошибки:

@FunctionalInterface
interface MyInterface {
    private void doSomething(); // Ошибка компиляции: приватный абстрактный метод
    void execute(); // Единственный абстрактный метод
}

Важное уточнение: Начиная с Java 9, в интерфейсах можно объявлять приватные методы, но они должны быть реализованы (default или static). Они служат вспомогательными методами для факторизации кода внутри default-методов и не являются абстрактными.

@FunctionalInterface
interface MyInterface {
    void execute(); // Единственный абстрактный метод

    default void helper() {
        doSomething(); // Вызов приватного метода
    }

    private void doSomething() { // Допустимо с Java 9
        // реализация
    }
}