Confessionário: bizarrices que você cometeu e sempre escondeu mas agora teve coragem de contar

Teve uma bizarrice que eu fiz e acabei descobrindo ser um undefined behavior do Java.

Eu queria criar uma tela (em Swing mesmo), cujo layout estivesse previamente definido. Então, fiz o layout, com botões e tudo mais. E chamei um painel, que seria definido na subclasse. Nada mais do que isso aqui:

add(criarPainelCentral());

Então, imaginem. Bastaria o cara criar uma subclasse “TelaCadastro”, filha de “TelaAbstrata”, implementar o método criarPainelCentral() e já ganharia parte do layout.
Nenhum problema, certo? Errado.

O problema é que esse add estava no construtor. E, como vcs sabem, classes são criadas de cima para baixo. Então, no momento em que criarPainelCentral() era chamado, por ser um método sobrescrito, ele chamava um método de uma classe que ainda não existia.

A JVM da Oracle se comporta de uma maneira um tanto bizarra nesse caso:
a) Ela chama o construtor da superclasse;
b) Ao chegar no método virtual, ele vai para a subclasse.
c) Ele cria todos os atributos que forem usados da subclasse, no momento em que forem chamados;
d) No final do método, ele termina de rodar o construtor da superclasse;
e) E aqui vem a pegadinha. Ao terminar o construtor da superclasse, ele roda o da subclasse recriando todos os atributos.

Ou seja, eu acabava com uma tela cujos componentes do painel central eram exibidos, mas não eram os mesmos componentes que estava nas propriedades da classe. :smiley:

Levei trezentos e oito anos para descobrir porque diabos os componentes ignoravam os comandos que eram dados a eles nesse painel central.
Resolvemos o problema trocando de herança para composição. A tela com os botões passou a receber o painel por parâmetro em seu construtor. :wink:

Acredite se quiser. Existem lugares onde isto é bem comum…

hehe…

nem faz muito tempo, eu tinha que criar uma tela aqui num sistema, seguindo um protótipo passado pela empresa cliente, mas várias coisas que dependiam de uns scripts usando jquery não funcionavam direito quando você pegava do protótipo e passava para a sua classe, esse era um problema que eu fui ver com um arquiteto da empresa e ele falou que tinha esse problema em vários lugares… essa tela ai era uma com abas, era adicionada uma div ao lado das abas da mesma forma que as divs das abas e nessa div adicional era colocada uma imagem de background, no protótipo isso funcionava normal, mas se eu copiasse esse código não exibia igual, ao invés de ir pro lado ia para baixo, não importando o tamanho vertical do lugar onde estava sendo inserida a aba, a tela com as abas, enfim… eu conseguia colocar acima do painel com as abas e posiciona-la mais para a direita, mas não ficava igual por que ficava mais para cima no layout não conseguia colocar do lado das abas como estava no layout (parece coisa besta mas perdi uma tarde inteira com isso), se eu mandasse posicionar mais para baixo, descia essa div mas descia a de baixo também ou dava algum outro problema de uma ficar em ciam da outra e ir para algum lado. No fim das contas eu deixei a div em cima mesmo posicionada a direita mas ai eu defini no css a margem de baixo negativa, assim o div de baixo ao invés de se distanciar se aproximava… e foi o único jeito que funcionou…

eu achei mesmo engraçada essa solução…rs

obviamente design e front end não é o meu forte… eu apenas quebro um galho como todo programador deveria…

Acidentalmente eu colei um link de um site que continha várias fotos de pessoas mortas em um documento aqui na empresa, e o documento foi para o chefe…a minha sorte é que o chefe viu antes de assinar e mandar para brasília.

Se conseguiu esconder talvez não seja tão bizarro assim.