#005 ActionScript [Q] Tips: Singleton en AS3

Para los que trabajábamos con clases en AS2, no era raro emplear un Singleton para alguna de ellas, con le objetivo de tener una clase general para toda la aplicación con la capacidad de acceder a ella desde cualquier punto de manera limpia. Con AS2 podíamos declarar constructores privados y dejar un código tal que así:

Singleton AS2

class Ejemplo
{
	private static var _instancia:Ejemplo;

	private function Ejemplo () { }

	public static function getInstancia():Ejemplo
	{
		if (_instancia == null)
		{
			_instancia = new Ejemplo();
		}
		return _instancia;
	}
}

Con esas líneas de código lográbamos que la clase solamente se pudiera instanciar una vez, y mediante Ejemplo.getInstancia(), podíamos tener la referencia a ella en cualquier punto de la aplicación. Genial.

Con AS3, no podemos declarar constructores privados, con lo que este modelo de Singleton nos deja de servir, por suerte hay alguna característica nueva en AS3 que nos permite mantener nuestros Singletons sin tener que cambiar demasiado la filosofía:

Singleton AS3

package
{
	class Ejemplo
	{
		private static var _instancia:Ejemplo;

		public function Ejemplo(enforcer:SingletonEnforcer) {}

		public static var getInstancia():Ejemplo
		{
			if (_instancia == null)
			{
				_instancia = new Ejemplo(new SingletonEnforcer());
			}
			return _instancia;
		}
	}
}

class SingletonEnforcer { }

No he traducido el SingletonEnforcer porque no encontraba una traducción que me gustara más que el inglés, y además es que yo lo uso así, por lo que me suena muy raro ponerlo de otra manera, de hecho en vez de _instancia para la propiedad privada, le enchufo _instance, y lo mismo con le nombre del método estático, pero vamos que como el blog en castellano, hay que castellanizar lo más que se pueda… XD

Este tip viene de la mano de un libro que pasó por mis manos hace tiempo, pero que es de muy recomendable lectura: Advanced ActionScript 3 Design Patterns.