Interface Segregation
Nutzer sollten nicht gezwungen sein Methoden zu implementieren, die sie nicht benötigen
Dieses Prinzip zielt darauf ab, Interfaces mit möglichst wenigen Methoden zu definieren, anstatt Interfaces mit vielen Methoden zu definieren, um alle Möglichen Fälle abzudecken.
Beispiel
interface Vehicle {
void startEngine();
void stopEngine();
void drive();
void fly();
}
class Car implements Vehicle {
@Override
public void startEngine() {
// implementation
}
@Override
public void stopEngine() {
// implementation
}
@Override
public void drive() {
// implementation
}
@Override
public void fly() {
throw new UnsupportedOperationException("This vehicle cannot fly.");
}
}
In diesem Beispiel implementiert die Klasse Car
das Interface Vehicle
. Da ein Auto nicht fliegen kann, wird die Methode fly
mit einer UnsupportedOperationException
geworfen. Das ist ein Verstoß gegen das Interface Segregation Prinzip, da das Interface unnötig viele Methoden fasst. Wir können das Interface in kleinere Interfaces aufteilen.
interface Engine {
void startEngine();
void stopEngine();
}
interface Drivable {
void drive();
}
interface Flyable {
void fly();
}
Wir teilen unser Interface in drei kleinere Interfaces auf: Engine
, Drivable
und Flyable
. Durch die kleineren Interfaces ist es deutlich einfacher für Klassen, sich nur Methoden bzw. Interfaces zu implementieren, die sie wirklich benötigen. Hier können wir nun die Klasse Car
und Airplane
ohne Probleme implementieren.
class Car implements Engine, Drivable {
@Override
public void startEngine() {
// implementation
}
@Override
public void stopEngine() {
// implementation
}
@Override
public void drive() {
// implementation
}
}
class Airplane implements Engine, Drivable, Flyable {
@Override
public void startEngine() {
// implementation
}
@Override
public void stopEngine() {
// implementation
}
@Override
public void drive() {
// implementation
}
@Override
public void fly() {
// implementation
}
}