Eduardo Issao Ito wrote:
> 
> O problema com essa solucao e' que se eu fizer
> 
> x = new MessageOutputStream();
> 
> x.getBos() vai retornar um stream diferente ao que foi passado a super
> classe de MessageOutputStream.

        Bem, o caso é que essa solução também não resolve o problema
original, que é passar uma stream para o construtor da classe base e
ao mesmo tempo manter a referência para essa mesma instância.

        Mesmo assim, obrigado pela tentativa Handerson!

        Um abraço,

Einar Saukas
Technical Consultant
Summa Technologies, Inc.
http://www.summa-tech.com



> Handerson Ferreira Gomes wrote:
> >
> > Oi Einar,
> >
> > ainda não sei se compreendi bem o seu problema. Mas vamos lá!
> >
> > Quando você está implementando um método construtor e faz a chamada ao
> > construtor da superclasse, utilizando super(), esta chamada deve ser feita
> > antes de qualquer ação dentro do construtor. Isto é uma característica não só
> > do Java, mas de outras linguagens de programação OO. Por isso sua primeira
> > tentativa não funcionou:
> > class MessageOutputStream extends ObjectOutputStream {
> >   private ByteArrayOutputStream _bos;
> >   MessageOutputStream() throws java.io.IOException {
> >     super(_bos = new ByteArrayOutputStream());  // ERRO!
> >   }
> > }
> >
> > Neste caso, ele tenta primeiro fazer _bos  = new ByteArrayOutputStrem() antes
> > de chamar o super( _bos);
> >
> > Você poderia fazer:
> >
> > import java.io.*;
> > class MessageOutputStream extends ObjectOutputStream {
> >   private ByteArrayOutputStream _bos = new ByteArrayOutputStream();
> >   MessageOutputStream() throws java.io.IOException {
> >     super();
> >
> >  }
> >
> >   MessageOutputStream(ByteArrayOutputStream bos) throws java.io.IOException {
> >  super(bos);
> >   _bos = bos;
> >  }
> > }
> >
> > No caso acima não enviando o parâmetro para o superconstrutor, já que durante
> > a execução ele faria a instanciação do new ByteArrayOutputStream() antes de
> > invocar o super. Ou seja, seu problema está resolvido, porque não tem solução.
> > O cliente vai ter que enviar a referência do objeto se você quiser usar o
> > super, ou então não usa o super e boa.
> >
> > Questoes conceituais, talvez você já saiba de tudo que está abaixo, mas pode
> > ser interessante para o pessoal que está começando:
> >
> > Os dados criados dentro de uma classe são pertencentes a esta classe, mas
> > podem ser referenciados por outros objetos enquanto a classe ainda não tenha
> > sido destruída. Isto é uma característica do encapsulamento. Quando declaramos
> > um objeto e passamos como referência um outro, estamos apenas apontando para o
> > objeto real, e portanto não temos uma nova cópia do objeto referenciado. Isto
> > significa que se o objeto original for destruído a referencia ficará,
> > obviamente sem referência. Mas acho que você já sabia disso... estou me
> > prolongando e vou acabar complicando... :)
> >
> > Escrevi um programa bem rapidamente para testar o que estava falando, está
> > abaixo:
> >
> > import java.io.*;
> > class MessageOutputStream extends ObjectOutputStream {
> >   private ByteArrayOutputStream _bos = new ByteArrayOutputStream();
> >   MessageOutputStream() throws java.io.IOException {
> >     super();
> >   }
> >   MessageOutputStream(ByteArrayOutputStream bos) throws java.io.IOException {
> >   super(bos);
> >   _bos = bos;
> >  }
> >   MessageOutputStream(FileOutputStream fos) throws java.io.IOException {
> >   super(fos);
> >  }
> >
> >  ByteArrayOutputStream getBos()
> >  {
> >   return _bos;
> >  }
> >  public static void main (String a[])
> >  {
> >   try{
> >      FileOutputStream ostream = new FileOutputStream("t.tmp");
> >    MessageOutputStream m = new MessageOutputStream(ostream);
> >
> >      m.writeObject("\n Dado adicionado em m");
> >    System.out.println("1:"+m.toString());
> >
> >      m.flush();
> > //  MessageOutputStream b = m;
> >    m = null;
> >    MessageOutputStream b = m;
> >
> >    Runtime.getRuntime().gc();
> >    b.writeObject("\nDado adicionado em b!!!!");
> >    System.out.println("2:"+b.toString());
> >     ostream.close();
> >   }
> >   catch (IOException e) {
> >     System.out.println("erro");
> >   }
> >  }
> > }
> >
> > Tente inverter os comentário e o erro que surgirá na execução:
> >
> > Exception in thread "main" java.lang.NullPointerException
> >         at MessageOutputStream.main(MessageOutputStream.java:35)
> >
> > Por causa da perda da referência.
> >
> > É isso, se não ajudei, desculpe.
> >
> > []'s
> > Handerson Ferreira Gomes


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

Responder a