Fabio Ramon wrote:
> Frederico,
>
> Eu concordo com o Einar. Mesmo no livro do Gamma, ele somente usa este artificio
>quando se trata de obter instancias de objetos que implementam uma
> interface (classe abstrata). Nesse caso me parece mais natural voce usar isso, uma
>vez que nao existe o construtor (e voce nem sabe qual o objeto que
> esta insanciando). Quando uma classe e' concreta e suas instancias são conhecidas me
>parece mais natural usar o construtor da propria classe (embora
> eu nao veja obrigatoriedade). De qualquer forma, a solucao que eu propus utiliza a
>sua solucao dentro do construtor e, a menos de nao ser thread-safe,
> eu acho que atende. Alias, se quisermos uma solucao thread-safe eu acho que devemos
>usar algo mais parecido com a sua solucao.
>
Eu concordo com voces. A solução de utilizar o construtor diretamente é realmente mais
natural!
A questão é que a outra solução não deixa de ser bonita pelo fato do cliente não poder
usar
MessageOutputStream var = new MessageOutputStream(); .
Se fosse assim os Creational Patterns do Gamma não seriam também bonitos - pensando no
lado
da utilização pelo cliente, embora como o Fábio citou as aplicações do Gamma sejam
diferentes.
Indo mais fundo ainda, construtores do tipo static factory não são tão incomuns
assim, quanto parece.
As APIs para construção de aplicações de gerencia de rede do TMForum ( antigo NMF ) são
baseadas em construções deste tipo. E não é factory virtual como há no livro do Gamma.
Abraços,
Fred.
>
> []'s
>
> Fabio Ramon
>
> PS: A solucao que eu propus:
>
> import java.io.*;
>
> class MessageOutputStream extends ObjectOutputStream {
> private static ByteArrayOutputStream temp;
> private static Object lock = new Object();
>
> // Your _bos
> private ByteArrayOutputStream _bos;
>
> static OutputStream getTemp() {
> synchronized (lock) {
> return temp = new ByteArrayOutputStream();
> }
> }
>
> public MessageOutputStream() throws IOException {
> super(getTemp());
> _bos = temp;
> }
>
> }
>
> "Frederico Charle S. Faria" wrote:
>
> > Einar Saukas wrote:
> >
> > > "Frederico Charle S. Faria" wrote:
> > > >
> > > > Einar Saukas wrote:
> > > > >
> > > > > Essa discussão está bem legal, mas de qualquer forma o problema
> > > > > original continua em aberto: como fazer para instanciar uma classe,
> > > > > repassá-la para o construtor da classe base e depois ainda guardá-la
> > > > > numa variável de instância?
> > > > >
> > > > > Ou, colocando o problema de outra forma, existe alguma maneira
> > > > > de implementar algo assim:
> > > > >
> > > > > class MessageOutputStream extends ObjectOutputStream {
> > > > > private ByteArrayOutputStream _bos;
> > > > > MessageOutputStream() throws java.io.IOException {
> > > > > super(_bos = new ByteArrayOutputStream()); // ERRO!
> > > > > }
> > > > > }
> > > > >
> > > > > ... de forma que o cliente possa usar essa classe fazendo
> > > > > apenas isto:
> > > > >
> > > > > MessageOutputStream var = new MessageOutputStream();
> > > > >
> > > > > Alguém tem mais sugestões?
> > > >
> > > > Talvez isto resolva seu problema:
> > > >
> > > > class MessageOutputStream extends ObjectOutputStream {
> > > > private ByteArrayOutputStream _bos;
> > > > static MessageOutputStream constroi() throws java.io.IOException {
> > > > ByteArrayOutputStream tmp = new ByteArrayOutputStream();
> > > > MessageOutputStream mos = new MessageOutputStream(tmp);
> > > > return mos;
> > > > };
> > > > MessageOutputStream(ByteArrayOutputStream _bosvar) throws
>java.io.IOException {
> > > > super(_bosvar);
> > > > _bos = _bosvar;
> > > > };
> > > > }
> > >
> > > Opa, essa é uma boa solução!
> > >
> > > Ela só não chega a ser perfeita porque a forma de instanciação da
> > > classe não fica muito natural. Quer dizer, ao invés da forma padrão:
> > >
> > > MessageOutputStream var = new MessageOutputStream();
> > >
> > > ... o cliente tem que fazer algo assim:
> > >
> > > MessageOutputStream var = MessageOutputStream.constroi();
> > >
> > > Pode não ser muito "bonito", mas já funciona melhor do que as
> > > que eu tinha pensado. Pelo menos ela esconde a utilização interna do
> > > ByteArrayOutputStream, que era o objetivo principal.
> >
> > Não concordo muito com essa opinião pois alguns dos Design Patterns do Gamma são
>baseados em implementações deste tipo. Mas o importante foi como
> > voce mesmo disse resolver o principal
> > objetivo!
> >
> > >
> > >
> > > Legal, é essa solução mesmo que eu vou adotar, a não ser que
> > > alguém consiga bolar alguma mágica para fazer a instanciação da forma
> > > convencional...
> > >
> > > Então obrigado pela idéia!
> > >
> > > Um abraço,
> > >
> > > Einar Saukas
> > > Technical Consultant
> > > Summa Technologies, Inc.
> > > http://www.summa-tech.com
> > >
> > > --------------------------- LISTA SOUJAVA ---------------------------
> > > http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
> > > [para sair da lista: http://www.soujava.org.br/forum/cadastrados.htm]
> > > ---------------------------------------------------------------------
> >
> > --
> > Frederico Charles S. Faria
> > Especialista em Sistemas
> > INATEL - PRODEP
> > Fone/Phone: +55 35 471-9280
> >
> > --------------------------- LISTA SOUJAVA ---------------------------
> > http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
> > [para sair da lista: http://www.soujava.org.br/forum/cadastrados.htm]
> > ---------------------------------------------------------------------
>
> --------------------------- LISTA SOUJAVA ---------------------------
> http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
> [para sair da lista: http://www.soujava.org.br/forum/cadastrados.htm]
> ---------------------------------------------------------------------
--
Frederico Charles S. Faria
Especialista em Sistemas
INATEL - PRODEP
Fone/Phone: +55 35 471-9280
--------------------------- LISTA SOUJAVA ---------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
[para sair da lista: http://www.soujava.org.br/forum/cadastrados.htm]
---------------------------------------------------------------------