Oliver Gierke
Erfahrenes Mitglied
Das klassische Singleton Pattern bindet die Zuständigkeit für Verwaltung der Anzahl der Objektinstanzen an die Klasse selbst. D.h. sie ist dafür zuständig, zu kontorllieren, dass es nur 1 Instanz gibt. Das verletzt zunächst erstmal das prinzip des Separation of Concerns. Zum anderen wird sowas schnell unheimlich kompliziert, wenn man mit verschiedenen ClassLoadern arbeitet (1 Singleton ist nämlcih immer nur per Classloader Singleton - d.h. es ist problemlos möglich trotzdem zwei Instanzen der Klasse zu haben - finde den Fehler - viel Spaß! ). Zum anderen hat solch technischer Code nichts in einer Klasse zu suchen, die Geschäftslogik implementiert. Durch die statische Zugriffsmethode wird das Testen unheimlich erschwert. Die Klasse wird zu einer globalen Variable. Dependencykontrolle wird schwer usw.* klassische Singletons
Reicht das?
Es spricht nichts dagegen, sicherstellen zu wollen, dass es von einer Klasse nur 1 Instanz gibt. Dies kontrolliert man dann aber besser mit einem Container (z.B. Spring).
* Dependencies selbst besorgen (lookups oder Erzeugung mit new)
Klassen die nicht nach dem Prinzip der DependencyInjection arbeiten instantiieren ihre Kollaborateure selbst oder machen einen Lookup (z.B. JNDI oder einfache FooBar.getInstance()). Dies sorgt dafür, dass versteckte Abhängigkeiten entstehen, die nicht an der Klassenschnittstelle sichtbar sind. Dies erhöht den Testaufwand ungemein. Ausserdem verletzt die Klasse Separation of Concerns, da sie (Geschäfts-)Logik implementiert und Logik, um ihre Umgebung aufzubauen.
Workaround / Lösung: DependencyInjection benutzen.
Der gebrauch von instanceof ist meist an Anzeichen für ein falsches Design , welches besser mit Vererbung realisiert wird.* instanceof (in 90% der Fälle)
Java:
public void accelerate(Vehicle vehicle) {
speed = vehicle.getSpeed();
if (vehicle instanceof Car) {
vehicle.setSpeed(speed +10);
} else if (vehicle instanceof Bike) {
vehicle.setSpeed(speed + 1);
}
}
Java:
public abstract class Vehicle() {
public abstract void accelerate();
}
public class Car extends Vehicle {
public void accelerate() {
this.speed += 10;
}
}
public class Bike extends Vehicle {
public void accelerate() {
this.speed += 1;
}
}
Gruß
Ollie
REINHAUN!