JavaRush /Курси /Java Core /Інтерфейси — це більше ніж інтерфейси — це поведінка

Інтерфейси — це більше ніж інтерфейси — це поведінка

Java Core
Рівень 2 , Лекція 8
Відкрита

— Привіт! У цій лекції хочу познайомити тебе з іще одною точкою зору на інтерфейси. Розумієш, клас – це найчастіше модель якогось конкретного об'єкта. Інтерфейс більше відповідає не об'єктам, а їхнім здібностям чи ролям.

Наприклад, такі речі як авто, велосипед, мотоцикл та колесо найкраще зобразити у вигляді класів та об'єктів. А такі їхні здібності як «можу їздити», «можу перевозити людей», «можу стояти» — краще зобразити у вигляді інтерфейсів. Дивись приклад:

Код на Java Опис
interface Moveable {
    void move(String newAddress);
}
— відповідає здатності пересуватися.
interface Driveable {
    void drive(Driver driver);
}
— відповідає здатності керуватися водієм.
interface Transport {
    void addStuff(Object stuff);
    Object removeStuff();
}
— відповідає здатності перевозити вантажі.
class Wheel implements Moveable {
    ...
}
— клас «колесо». Має здатність пересуватися.
class Car implements Moveable, Drivable, Transport {
   ...
}
— клас «авто». Має здатність пересуватися, керуватися людиною і перевозити вантажі.
class Skateboard implements Moveable, Driveable
{
...
}
— клас «скейтборд». Має здатність пересуватися і керуватися людиною.

Інтерфейси дуже спрощують життя програміста. Дуже часто у програмі тисячі об'єктів, сотні класів та лише пара десятків інтерфейсів – ролей. Ролей мало, а їхніх комбінацій – класів – дуже багато.

Увесь сенс в тому, що тобі не потрібно писати код для взаємодії з усіма класами. Тобі достатньо взаємодіяти зі своїми ролями (інтерфейсами).

Уяви, що ти – робот-будівельник, і в тебе є десятки роботів, кожен з яких може мати кілька професій. Тобі потрібно терміново добудувати стіну. Ти береш усіх роботів, які мають здатність «будівельник» і кажеш їм будувати стіну. Тобі байдуже, що це за роботи. Хоч робот-поливалка. Якщо він уміє будувати – нехай іде будувати.

Ось як це виглядало б у коді:

Код на Java Опис
static interface WallBuilder {
    void buildWall();
}
— здатність «будівельник стін». Розуміє команду «(по)будувати стіну» — має відповідний метод.
static class РобітникРобот implements WallBuilder {
    public void buildWall() {
        …
    }
}
static class РоботОхоронець implements WallBuilder {
    public void buildWall() {
        …
    }
}
static class Поливалка {
    …
}
— роботи, у яких є ця професія/особливість.

— для зручності я зробив класам імена українською. Таке допускається в java, але вкрай небажано.

— поливалка не має здатності будувати стіни (не реалізує інтерфейс WallBuilder).

public static void main(String[] args) {
   //додаємо усіх роботів у список
    ArrayList robots = new ArrayList(); 
    robots.add(new РобітникРобот());
    robots.add(new РоботОхоронець());
    robots.add(new Поливалка());

    //будувати стіну, якщо є така здатність
    for (Object robot: robots) {
        if (robot instanceof WallBuilder) {
            WallBuilder builder = (WallBuilder) robot;
            builder.buildWall();
        } 
    }
}
— як дати їм команду – побудувати стіну?

— Страшенно цікаво. Навіть не думав, що інтерфейси – така цікава тема.

— А то! Разом з поліморфізмом – це взагалі щось неймовірне.

Коментарі (1)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Truman Рівень 37
30 березня 2025
Статический модификатор можно использовать только для вложенных интерфейсов, то есть если интерфейс объявлен внутри другого класса. Если интерфейс объявлен внутри класса, его можно явно пометить как static. Фактически, все вложенные интерфейсы по умолчанию являются статическими, поэтому указание static не обязательно, но допустимо.