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