Verificar a existência de um objeto na memória

Yeah!!! Pode crer!!!

Você sabe, né? Sempre tem aqueles que “dão um new” ao invés de utilizar uma “factory”. :roll:

Aaaaaaah bom, entao ta’ :smiley:

Ficam aqui entao as duas sugestoes que pipocaram no meio da discussao, entao:

  • Fazer construtores protected: assim, so quem esta no mesmo pacote ou herda o objeto pode construi-lo

  • Usar uma implementacao de AOP que suporte advices no construtor, pra puxar o objeto da factory ao inves de criar um novo. Nem sei se existe alguma (provavelmente o AspectJ suporta esse tipo de coisa, mas eu nao tenho certeza), e talvez nao compense o esforco…

Sobre AOP, de uma procurada aqui no GUJ, eu ja postei um monte de coisa ja faz um tempinho… e, sobre o AspectJ, http://aspectj.org :smiley:

Vou procurar sim… fiquei curioso… :?: :?: :?:

Vc pode fazer uma factory “universal” se vc restringir os contrutores dos seus objetos especiais. Muitos containers te obrigam a ter um construtor sem argumentos, o pico se nao me engano te obriga a ter so um (por subclasse, i.e., uma subclasse pode ter um construtor diferente da classe pai).

Desse jeito, eles conseguem instanciar seu construtor por reflexao:

public Constructible newInstance(Class cl) {
   Object obj = loadedInstances.get(cl);
   if (obj == null) {
      obj = cl.getDeclaredConstructor(null).newInstance(null);
   }
   return (Constructible) obj;
}

Aquelao!!

Bom vc ter lembrado do Pico aqui… parece que eh um bom candidato a factory generica nesse caso… primeiro pq ja vem pronto, e segundo, pq é muito facil de usar :smiley:

Para saber mais: http://picocontainer.codehaus.org :wink:

Voce pode utilizar aspect oriented programming e botar um hook antes do new.

Ou entao pode ser mais radical e mandar um runtime no contstrutor:

public class Foo { private boolean marcadorDeExistenciaTabajara = false; public Foo() { if ( marcadorDeExistenciaTabajara ) { throw new RuntimeException("Porrada mano!"); } marcadorDeExistenciaTabajara = false; } }