Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Aqui está uma dica útil para programadoresFlash e Flex. O ActionScript 3.0 é ótimo, mas não tem nenhum Singleton.
Samuel Aglesias comentou, certa vez, sobre uma solução que previne, com sucesso, assubclasses de chamarem o construtor usando super(), mas ela não previne outroscódigos de criarem novas instâncias de classe com new.
Portanto, eu apresento a você uma maneiraengenhosa de tornar um construtor verdadeiramente privado: adicione umargumento necessário ao construtor, que deve ser configurado com um valor secretoque somente é conhecido pela classe:
class Singleton {
private static var _instance:Singleton = null;
// secret known only to this class
private static const secret:Number = Math.random();
/**
* @private
*/
public function Singleton(enforcer:Number) {
if (enforcer != secret) {
throw new Error("Error: use Singleton.instance instead");
}
}
/**
* Global single instance
*/
public static function get instance():Singleton {
if (_instance == null) {
_instance = new Singleton(secret);
}
return _instance;
}
}Esse método também tem a vantagem de ser bastante rápido, e oferecer um nível de proteção na compilação: new Singleton() irá falhar em tempo de compilação. O usuário fariaa compilação funcionar se passasse, por exemplo, new Singleton(42), mas existeuma chance muito grande* de que isso falhe na hora da execução.
Use essatécnica sempre que o construtor deva ser chamado somente de dentro de umaclasse, para que seus usuários não cometam o erro de criar uma segundainstância do singleton.
* Nerds àparte: a mudança em adivinhar o resultado do Math.random() é 1 para 2^52, ou1/4,503,599,627,370,496. Isso acontece porque os floating point numbers de 64 bits têm umamantissa de 52 bits.
**Update:** Grant Skinner tem [outra maneira](http://www.gskinner.com/blog/archives/2006/07/as3_singletons.html) de fazer a mesma coisa. A dele éprovavelmente mais elegante, mas menos divertida, e a diversão é umacaracterística que eu valorizo em hacks de linguagens. Além disso, sua solução não éverificada na hora da compilação. Andrew Trice [tentou também](http://www.cynergysystems.com/blogs/page/andrewtrice?entry=singleton_in_as3). A versão dele requer umargumento extra que forneça a verificação na hora da compilação, mas ele podeser derrotado pelo chamado new Singleton(Singleton.getInstance). Obrigadopelos links, Shaun.
**Update 2:** Eric J Feminella tem [umasolução](http://www.ericfeminella.com/blog/as3-model-view-controller-implementation/) queé indiscutivelmente melhor que a minha, uma vez que ela é propriamente checadana hora da compilação, p.e., você não consegue enganar passando um inteiro de argumento, adiando o erro para tempo de execução (ao invés de lançar uma exceção, retornar nulo também funcionaria). Mas eu ainda acho que a minha solução é mais divertida...
http://imasters.com.br/artigo/21146/flash/construtores-privados-apropriados-para-actionscript-30
Carregando comentários...