Singleton-Pattern mit ActionScript
Raphael Vullriede November 30th, 2009
In einem aktuellen Kundenprojekt setzen wir im Backend wir gehabt Java EE ein, als Frontend kommt aufgrund spezieller Anforderungen ein RichClient auf Adobe AIR Basis zum Einsatz. Bei der Umsetzung hilft uns ein externer Partner, der uns im AIR Umfeld ein wenig aufmunitioniert
Bei einem Blick in die Quelltexte, die in unserem Subversion aufgeschlagen sind, bin ich über ein Konstrukt nach folgendem Muster gestoßen:
package de.vullriede {
public class Singleton {
private static var _instance:Singleton;
public function Singleton(enforcer:SingletonEnforcer) {
if (!enforcer) {
throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" );
}
}
public static function get instance():Singleton {
if(!Singleton._instance) {
Singleton._instance = new Singleton(new SingletonEnforcer());
}
return Singleton._instance;
}
}
}
class SingletonEnforcer{}
Was die Klasse machen soll war mir schnell klar: klassisches Singleton-Pattern, allerdings auf kreative Art und Weise implementiert. Dem Konstruktor wird ein Argument übergeben, welches außerhalb des Packages deklariert ist und somit nicht verwendbar. Es ist also nicht möglich die Klasse selber zu instanziieren; die einzige Instanz ist über getInstance() erreichbar.
In Java würde man das ähnliches mit einem privaten Konstruktor machen, der dann nur von der getInstance()-Methode benutzt werden kann:
package de.vullriede;
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Google hat mich dann aufgeklärt, dass das obere Konstrukt kein schmutziger Hack ist. sondern Best Practice, da ECMAScript und damit auch ActionScript 3 keine privaten Konstruktoren kennt.
Welche Lösung eleganter ist darf jeder selbst entscheiden.
- ActionScript , Air , Flash , Java
- Comments(0)