Sim, com certeza Ito...

Pois x estará apontando um novo objeto criado pelo new, e não ao antigo
MessageOutpuStream.. a referência aquele objeto já era.

Estamos realmente com um problema difícil de resolver...
Talvez possamos fazer algo como o próprio Java que passa algumas referências através
de métodos do tipo getInstance() ou semelhantes, principalmente para classes
abstratas, já que elas não podem ser construídas (Image, Tookit)

A discussão está boa!

[]'s
Handerson F. Gomes

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.
>
> 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]
> >     ---------------------------------------------------------------------
>
> --
> Eduardo Issao Ito <[EMAIL PROTECTED]>
> Eurosoft Consultoria <http://www.euroconsult.com.br>
> Rua Marina Saddi Haidar, 176 - São Paulo - SP - Brasil
> CEP 04650-050
> TEL: +55 11 524-8022
> FAX: +55 11 524-0408

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