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

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

Ответ

Да, может. Это распространенный прием для сокрытия реализации. Хотя сам приватный внутренний класс (private inner class) недоступен извне внешнего класса, его экземпляр, возвращенный публичным методом, может быть использован через публичный интерфейс (например, суперкласс или интерфейс).

Пример:

public class DataContainer {
    // Приватный внутренний класс, скрывающий детали реализации.
    private class SecretData implements Data {
        private String value = "Confidential";
        @Override
        public String getInfo() {
            return value;
        }
    }
    // Публичный метод, возвращающий экземпляр приватного класса, но объявленный как интерфейс Data.
    public Data getData() {
        return new SecretData();
    }
}

// Клиентский код работает только с интерфейсом.
Data data = new DataContainer().getData();
System.out.println(data.getInfo()); // Вывод: Confidential

Ключевой момент: Клиентский код получает ссылку на объект, но его тип будет объявленным возвращаемым типом метода (например, Data), а не конкретным приватным классом (SecretData). Это обеспечивает инкапсуляцию.