Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Интерфейсы Java: Введение в ООП

Классы в Java — основы основ, но их описание будет неполным без интерфейсов с, которыми они тесно связаны. Интерфейсы — более простая конструкция, но, как и в случае с классами, полное понимание интерфейсов требует опыта работы с ними. Зачем они нужны? Интерфейсы позволяют задавать требования к классам, то есть какие методы требуются от класса. Предположим, что мы хотим работать в приложении с генератором паролей. Генератор в нашем случае это обычный класс, с методом generate(), возвращающим пароль.

var generator = new SimplePasswordGenerator();
generator.generate(); // Возвращает готовый пароль
generator.generate(); // Уже другой пароль

Теперь с помощью интерфейса опишем требования к классу генератору. Опишем два метода generate(): один без параметров, другой — с возможностью настройки длины пароля.

interface PasswordGenerator {
    String generate();
    String generate(int length);
}

Теперь интерфейс нужно реализовать. Делается это в определении класса:

class SimplePasswordGenerator implements PasswordGenerator {
    public String generate() {
        // Обращаемся к методу объекта
    // 16 – выбранное значение по умолчанию
    return this.generate(16);
    };

    public String generate(int length) {
        // Тут логика генерации пароля
    };
}

Интерфейсы не ограничивают класс в его расширении, помимо интерфейсных методов мы можем добавить все что угодно. Единственное ограничение, которое накладывают интерфейсы – методы, указанные в них, должны быть реализованы в точности как они описаны.

Хорошо, вот мы ввели интерфейс, что он нам дал? Если коротко: полиморфизм, а если точнее — полиморфизм подтипов (subtyping). Прямо сейчас он нам не очень нужен, но для общего развития попробуем ухватить его идею. Осторожно, дальнейший текст может напугать. Если он кажется вам сложным, просто пропустите, все это мы будем повторять еще не раз.

Код, который будет использовать passwordGenerator может выглядеть так:

class UserController {
    // Здесь создаются пользователи
    // Этот код вызывается где-то внутри приложения при регистрации пользователя
    public create() {
        // Создаем пользователя
        // И где-то тут же генерируем ему пароль
        var generator = new SimplePasswordGenerator();
        var password = generator.generate();
    }
}

Неплохой код, но представьте, что класс может меняться без изменения кода, просто в зависимости от того, какие опции выбирает пользователь при генерации пароля. Вполне реальная ситуация. Самый простой способ реализовать такую схему — вставить условие на параметр, который вводит пользователь. В одном случае берем один класс, в другом другой.

var generator;
if (userChooseSomething) {
    generator = new SimplePasswordGenerator();
} else {
    generator = new SuperPasswordGenerator();
}

И вот такой код уже может стать проблемой если генераторы будут постоянно добавляться. Ситуация ухудшится, когда эта конструкция начнет расползаться по разным частям проекта. Интерфейсы изящно решают такие ситуации. Код меняется на такой:

class UserController {
    // Интерфейс = Тип
    public create(PasswordGenerator generator) {
        var password = generator.generate();
    }
}

Интерфейсы в Java являются настоящими типами данных и поэтому их можно указывать в определениях методов. В коде выше видно, что мы требуем передавать в метод create тип PasswordGenerator. Таким типом будет любой объект, класс которого реализует нужный интерфейс. В получившимся коде генератор создается не в том месте, где используется, он создается где-то раньше, а в код уже приходит нужная реализация.

Все это уже станет актуальным как только мы дойдем Java-коллекций. Осталось недолго)

Соглашения и правила

К интерфейсам предъявляются такие же требования как и к классам

  1. Один файл – один интерфейс. Имя файла и интерфейса совпадают
  2. Интерфейсы начинаются с заглавной буквы

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
30 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»