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