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

Einar Saukas wrote:

> Ricardo Muneo Kayo wrote:
> >
> > Vc jah tentou usar essa classe com a sua ultima implementacao(4a. do
> > email)? Funcionou???
>
>         Sim, funcionou.
>
> > Pelo que eu entendi, vc quer fazer uma heranca multipla em JAVA, meio
> > mascarado, nao eh??? Acho que nao vai funcionar!!!
>
>         N�o, eu simplesmente queria fazer uma heran�a simples da classe
> ObjectOutputStream mesmo. A �nica dificuldade � que eu preciso preservar
> o par�metro que eu estou passando para o construtor dessa classe.
>
>         � bastante razo�vel que minha primeira op��o n�o funcione, porque
> eu n�o posso mesmo acessar vari�veis da inst�ncia antes de inicializar a
> base. Mas quanto � segunda op��o (usar vari�veis tempor�rias antes de
> inicializar a base), eu n�o vejo nenhum motivo para isso n�o funcionar,
> porque afinal de contas tais informa��es ficam armazenadas na pilha e
> n�o na �rea de mem�ria da inst�ncia.
>
>         Tem algu�m nessa lista de discuss�o que acompanhe mais de perto
> o processo de padroniza��o do Java (Bruno?) e saiba dizer se tem algum
> motivo para essa restri��o? Ser� que isso � imposto pelo padr�o ou
> simplesmente uma particularidade da implementa��o atual do JDK?
>
>         Um abra�o,
>
> Einar Saukas
> Technical Consultant
> Summa Technologies, Inc.
> http://www.summa-tech.com
>
> > Einar Saukas wrote:
> > >
> > >         Oi pessoal!
> > >
> > >         Encontrei um problema interessante no projeto em que estou
> > > trabalhando, ser� que algu�m tem alguma sugest�o? Minha inten��o
> > > era fazer uma classe assim, s� que n�o funciona:
> > >
> > > class MessageOutputStream extends ObjectOutputStream {
> > >   private ByteArrayOutputStream _bos;
> > >   MessageOutputStream() throws java.io.IOException {
> > >     super(_bos = new ByteArrayOutputStream());  // ERRO!
> > >   }
> > > }
> > >
> > >         Todas as outras solu��es semelhantes que eu consegui imaginar
> > > tamb�m n�o funcionam, como essa por exemplo:
> > >
> > > class MessageOutputStream extends ObjectOutputStream {
> > >   private ByteArrayOutputStream _bos;
> > >   MessageOutputStream() throws java.io.IOException {
> > >     ByteArrayOutputStream tmp = new ByteArrayOutputStream();
> > >     super(tmp);  // ERRO!
> > >     _bos = tmp;
> > >   }
> > > }
> > >
> > >         Na verdade, existe uma �nica variante que funciona, mas �
> > > uma p�ssima solu��o:
> > >
> > > class MessageOutputStream extends ObjectOutputStream {
> > >   static ByteArrayOutputStream tmp;
> > >   private ByteArrayOutputStream _bos;
> > >   MessageOutputStream() throws java.io.IOException {
> > >     super(tmp = new ByteArrayOutputStream());
> > >     _bos = tmp;
> > >   }
> > > }
> > >
> > >         Por isso, a solu��o que eu acabei adotando foi deixar parte
> > > da inicializa��o para ser feita pelo "cliente" da classe:
> > >
> > > class MessageOutputStream extends ObjectOutputStream {
> > >   private ByteArrayOutputStream _bos;
> > >   MessageOutputStream(ByteArrayOutputStream bos)
> > >       throws java.io.IOException {
> > >     super(bos);
> > >     _bos = bos;
> > >   }
> > > }
> > >
> > >         Em todo caso, se algu�m tiver alguma id�ia de como implementar
> > > minha inten��o original, eu agrade�o. Eu acho que n�o tem muito jeito,
> > > mas n�o custa nada perguntar...
> > >
> > >         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]
>     ---------------------------------------------------------------------

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