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