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.
[]'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]
---------------------------------------------------------------------