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