Інтерфейси в java
У деяких ситуаціях, в процесі розробки програмного забезпечення, виникає необхідність, коли різним групам програмістів треба «домовитися» про те, як їх програми будуть взаємодіяти. Кожна група повинна мати можливість писати свій код не залежно від того, як пише його інша група. Інтерфейси і є цей «договір». Ми вже користувалися інтерфейсами в уроці анотації в Java.
У цьому уроці ми вивчимо їх докладніше: для чого вони потрібні, як їх оголошувати і т.д.
Уявіть собі майбутнє, де автомобілями керують комп'ютери без участі людини. Виробники автомобілів пишуть програмне забезпечення (на Java, звичайно 🙂), яке управляє машиною - зупинитися, поїхати, повернути і т.д. Інші розробники роблять системи, які приймають дані GPS (Global Positioning System) і використовують ці дані для управління автомобілем. Виробники автомобілів публікують інтерфейс-стандарт, який описує методи для управління машиною. Таким чином сторонні розробники можуть знати які методи викликати, щоб змусити автомобіль рухатися, а виробники автомобілів можуть змінювати внутрішню реалізацію свого продукту в будь-який час. Жодна з груп розробників не знає як написані їх програми.
інтерфейси Java
Сигнатури методів оголошуються без дужок і закінчуються крапкою з комою. Для використання інтерфейсу ви повинні написати клас, який буде реалізовувати ваш інтерфейс. Клас який реалізує інтерфейс, повинен описувати всі методи, оголошені в інтерфейсі. наприклад:
В наведеному вище прикладі - виробники автомобілів пишуть програмне забезпечення кожен по-своєму, але з однаковим інтерфейсом. Сторонні розробники - клієнти інтерфейсу, можуть писати власне ПО з використанням методів, оголошених в інтерфейсі.
Інтерфейси як API
Приклад з автомобілями показує як інтерфейси можуть використовуватися в якості API (Application Programming Interface) або інтерфейсу програмування додатків. Використання API - звичайна практика при розробці комерційного ПЗ. Зазвичай компанії-розробники продають програмне забезпечення, що містить набір методів, які інші компанії хочуть використовувати в своїх продуктах.
Інтерфейси і множинне спадкування
Інтерфейси грають ще одну важливу роль в мові программіровнія Java. Java не дозволяє множинного спадкоємства, але інтерфейси надають альтернативу. В Java клас може успадковувати тільки один клас, але може реалізовувати багато інтерфейсів. Таким чином об'єкти можуть мати кілька типів: тип їх власного класу і типи всіх реалізованих інтерфейсів. При створенні об'єктів класу в якості типу може вказуватися ім'я реалізованого в класі інтерфейсу. Іншими словами, якщо клас реалізує інтерфейс, то посилання на об'єкт цього класу можна привласнити інтерфейсної змінної - змінної, як тип якої вказано ім'я відповідного інтерфейсу.
Модифікатор доступу public означає що інтерфейс може бути використаний будь-яким класом в будь-якому пакеті. Якщо не визначити інтерфейс як публічний, він буде доступний тільки в рамках свого пакета. Інтерфейс може успадковувати інші інтерфейси, як класи можуть успадковувати інший клас. На відміну від класів, інтерфейси можуть наслідувати будь-яку кількість інших інтерфейсів.
Реалізація інтерфейсу
Приклад простого інтерфейсу
Розглянемо інтерфейс, який визначає метод для порівняння об'єктів.
Щоб мати можливість порівнювати об'єкти ми повинні реалізувати інтерфейс Relatable. Будь-клас може реалізувати інтерфейс Relatable. якщо є спосіб порівняти об'єкти. Для рядків порівнювати можна символів, для книг - кількість сторінок, для студентів - вага і т.д. Для плоских геометричних фігур відмінною характеристикою буде площа, для тривимірних - обсяг. Всі ці класи можуть реалізувати метод isLargerThan (). Якщо ви знаєте, що клас реалізує інтерфейс Relatable. то ви сміливо можете порівнювати об'єкти цього класу.
Реалізація інтерфейсу Relatable
Напишемо клас Rectangle. який реалізує інтерфейс Relatable.
Так як клас RectanglePlus реалізує Relatable. розміри будь-яких двох об'єктів типу RectanglePlus можна порівнювати.
Метод isLargerThan як аргумент приймає об'єкти типу Relatable. При реалізації методу в прикладі вище ми використовуємо приведення типів, тому що компілятор не зрозуміє що, other - об'єкт типу RectanglePlus і виклик методу other.getArea () без приведення типів призведе до помилки.
Використання інтерфейсу в якості типу
Коли ви оголошуєте інтерфейс, ви оголошуєте новий контрольний тип даних. Ви можете використовувати назву інтерфейсу в якості типу даних так само як і будь-які інші типи. Якщо ви оголошуєте змінну типу интерфеса, то ви можете можете присвоїти їй об'єкт будь-якого класу, який реалізує цей інтерфейс.
Розглянемо приклад - метод, який шукає більший об'єкт з двох будь-яких об'єктів, клас яких реалізує інтерфейс Relatable:
Приведенням object1 до типу Relatable. ми робимо можливим виклик методу isLargerThan.
Так само для будь-якого класу, що реалізує интерфес Relatable, можна реалізвать методи:
перевизначення інтерфейсів
Припустимо, ви написали інтерфейс DoIt:
Припустимо, пізніше, ви захотіли додати в нього третій метод:
Якщо ви зробите це зміна, то все класи, що реалізують цей інтерфейс зламаються, тому що вони перестануть його реалізовувати.
Намагайтеся уникати подібних змін і продумувати інтерфейс повністю спочатку. Але часто на практиці це неможливо і виходом з цієї ситуації може бути визначення нового інтерфейсу DoItPlus. який розширює DoIt:
Тепер користувачі вашого інтерфейсу зможуть перейти до використання нового інтерфейсу або залишитися зі старим без болю.
Дивіться також
- Вкладені і внутрішні класи в Java. Частина 2

- Вкладені і внутрішні класи в Java. Частина 1

- Рядки в Java

- Управління рядками, функції для роботи з рядками в Java. Частина 2

- Основи регулярних виразів в Java. частина 3

- Управління рядками, функції для роботи з рядками в Java.

- Регулярні вирази в Java. Частина 2

- Робимо JavaFX додаток красивим за допомогою CSS
