"Frederico Charle S. Faria" wrote:
> 
> Einar Saukas wrote:
> 
> > "Frederico Charle S. Faria" wrote:
> > >
> > > Agora o motivo porque os projetores de Java decidiram por isso - exigir o
> > > super() na primeira linha impossibilitando mesmo a  utiliza��o de vari�veis
> > > n�o membros - com certeza foi devido a fatores de complexidade de
> > > implementa��o  e performanca. ( da MV)
> >
> >         Muito obrigado pelas informa��es, mas eu conhe�o um pouco sobre
> > t�cnicas de compila��o e n�o vejo porque a utiliza��o de vari�veis
> > locais afetaria significativamente a implementa��o e muito menos a
> > performance. Afinal de contas, para um compilador, esse trecho de c�digo:
> 
> Primeiramente voce entendeu errado!  A perda de performance e a dificuldade de
> implementa��o
> n�o se referem a utiliza��o de vari�veis locais , mas sim a decis�o de projeto
> dos fundadores do Java
> ,ou seja,  exigir que o super() seja o primeiro comando do construtor.

        Na verdade eu n�o entendi errado, � que eu me expressei mal. Eu
deveria ter sido mais claro. O que eu quis dizer � que eu n�o vejo porque
a utiliza��o de vari�veis locais ANTES DA CONSTRU��O DA CLASSE BASE (AO
INV�S DE S� DEPOIS) afetaria significativamente a implementa��o e muito
menos a performance.


> Espero que perceba a diferen�a, e veja que se fosse de maneira contr�ria a
> implementa��o seria mais  dif�cil e a
> performance com certeza mais pobre!!!

        Em rela��o ao compilador, eu concordo que a implementa��o seria
um pouco mais dif�cil, porque no parser ele teria que sempre verificar
se o super() n�o aparece mais "pra frente", depois da inicializa��o de
algumas vari�veis locais. Mas isso n�o � t�o complicado assim, a
diferen�a no tempo de compila��o dificilmente seria percept�vel, quer
dizer, realmente afetaria um pouco a implementa��o mas n�o de forma
significativa.

        J� a performance depende apenas do tempo de interpreta��o do
bytecode, algo que n�o � afetado pela complexidade do parser.


> > MessageOutputStream() throws java.io.IOException {
> >   ByteArrayOutputStream tmp = new ByteArrayOutputStream();
> >   super(tmp);  // ERRO!
> > }
> >
> >         Tem praticamente a mesma complexidade deste aqui:
> >
> > MessageOutputStream() throws java.io.IOException {
> >   super(new ByteArrayOutputStream());
> > }
> 
> Voce est� errado! Isto depende da implementa��o do Compilador.. Para C++ , por
> exemplo, existem
> v�rias implementa��es diferentes para isso! Vejo o livro do Meyers, ele cita
> exemplos de implementa��o
> deste tipo. Tem compiladores que usam algumas t�cnicas de otimiza��o quando �
> utilizada esta �ltima constru��o.
> Talvez alguns  compiladores  Java utilizem esta mesma t�cnica.

        Mas em rela��o a otimiza��es no c�digo gerado, se houver opera��es
envolvendo tempor�rios dentro do construtor, n�o vai fazer realmente muita
diferen�a se elas ocorrem antes ou depois da chamada ao construtor da
classe base.


> >         � primeira vista, o compilador s� tem que ser um pouco mais
> > cuidadoso na manipula��o da pilha de execu��o, mas isso parece ser
> > muito f�cil de resolver. Ser� que tem algum outro fator que eu n�o
> > percebi?
> 
> � f�cil de perceber que � mais ineficiente... Imagine um construtor com v�rias
> chamadas de m�todos
> aninhados, com a implementa��o corrente basta para o compilador  analisar a
> primeira linha do construtor.
> Se n�o fosse assim o compilador teria que analisar toda a a�rvore de m�todos
> aninhados para
> garantir que n�o houvesse nenhuma referencia a algum atributo da classe antes da
> chamada do super.
> Mais mem�ria e mais processador!!.  Este � um simples exemplo...

        � verdade, voc� tem raz�o! A quest�o n�o � performance, mas sim
a velocidade de compila��o. Os idealizadores do Java deveriam estar
preocupados em manter uma sintaxe que permitisse uma compila��o o mais
direta poss�vel, para que as ferramentas de desenvolvimento n�o ficassem
muito pesadas. Este provavelmente tamb�m foi um dos fatores que os
levaram a deixar de fora recursos como sobrecarga de operadores, uma das
coisas que tornam a compila��o de C++ algo t�o pesado. OK, muito obrigado
pelas informa��es!

        Essa discuss�o est� bem legal, mas de qualquer forma o problema
original continua em aberto: como fazer para instanciar uma classe,
repass�-la para o construtor da classe base e depois ainda guard�-la
numa vari�vel de inst�ncia?

        Ou, colocando o problema de outra forma, existe alguma maneira
de implementar algo assim:

class MessageOutputStream extends ObjectOutputStream {
  private ByteArrayOutputStream _bos;
  MessageOutputStream() throws java.io.IOException {
    super(_bos = new ByteArrayOutputStream());  // ERRO!
  }
}

        ... de forma que o cliente possa usar essa classe fazendo
apenas isto:

MessageOutputStream var = new MessageOutputStream();

        Algu�m tem mais sugest�es?

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

Responder a