Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RSS iMasters

[Resolvido] Construtores privados apropriados para ActionScript 3.0

Recommended Posts

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 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. 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 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.