Ответ
Интерфейс — это абстрактный тип, который определяет контракт (набор методов), который должны реализовать классы. Он описывает что должен делать объект, но не как он это делает.
Основные цели и преимущества интерфейсов:
- Абстракция и полиморфизм: Позволяют работать с объектами через их общий интерфейс, а не конкретную реализацию. Это основа принципа «программируйте на уровне интерфейсов, а не реализаций».
List<String> list = new ArrayList<>(); // Ссылка типа интерфейса list = new LinkedList<>(); // Легкая замена реализации - Множественное «наследование»: Класс в Java может реализовать множество интерфейсов, что компенсирует отсутствие множественного наследования классов.
- Слабая связанность (Loose Coupling): Код зависит от абстракции (интерфейса), а не от конкретного класса. Это упрощает тестирование (можно использовать моки) и модификацию системы.
- Определение ролей: Интерфейс может определять специфическую роль объекта (например,
Comparable,Runnable,Serializable).
Пример:
// Контракт для объектов, которые можно отрисовать
interface Drawable {
void draw();
default void printInfo() { // default-метод (Java 8+)
System.out.println("This is a drawable object.");
}
}
// Контракт для объектов с цветом
interface Colored {
String getColor();
}
// Класс реализует два интерфейса
class Circle implements Drawable, Colored {
private String color;
public Circle(String color) { this.color = color; }
@Override
public void draw() {
System.out.println("Drawing a " + color + " circle.");
}
@Override
public String getColor() {
return color;
}
}
// Использование
Drawable drawable = new Circle("red");
drawable.draw(); // Drawing a red circle.
drawable.printInfo(); // This is a drawable object.
Роль: Интерфейсы являются фундаментальным механизмом для проектирования гибких, расширяемых и поддерживаемых систем, соответствующих принципам SOLID (в частности, принципам разделения интерфейса и зависимости от абстракций).