Eu gosto de ir aos mais pequenos pormenores do java e uma das curiosidades com que me deparei ultimamente foi esta, reparem:
import javax.swing.*;
e
import javax.swing.JButton;
a minha questão é… há alguma desvantagem em chamar o package swing inteiro? em vez de chamar só os que a gente sabe que vai usar? ou quando a gente declara da primeira maneira embora a gente esteja a chamar o package todo ele só irá chamar as classes que iram ser usadas?
Eu acho que não há nenhuma diferença do primeiro para o segundo, mas no entanto queria confirmar…
Quando você faz um import com * o compilador irá ver quais classes você realmente está usando e deixará apenas elas no seu arquivo .class.
Desta forma, a partir do momento que o programa já está compilado, não faz diferença se o import foi declarado diretamente pela classe ou pelo package.
Tudo que foi falado até agora teoricamente funciona assim…
mas fiz um teste prático em minhas aplicações…
tenho apliações que levavam cerca de 10 segundos para abrir na tela… apenas importei exatamente o que queria ao invés de importar todas a classes… e minhas aplicações startam significativamente mais rápido… umas delas de 10 segundos passou a startar em 3… outra de 8 segundos… em 4. Uma outra aplicação está mais pesada de 18 ou 20 segundos passou a startar em apenas 7 ou 10 segundos…
Não estou querendo contrariar o que já foi dito acima… mas preferi importar somente o que vou usar pois fiz os testes e vi que há diferença…
Sem querer ser teimosa e já sendo, sugiro que você refaça o teste com o import * para ver se o tempo aumenta novamente. Talvez tenha sido uma coincidência que quando você modificou o tempo foi reduzido.
Meus argumentos para dizer que o class gerado fica igual são:
Dizem que é assim que funciona e alegam ter feitos teste
O tamanho do class gerado em ambos os casos é exatamente o mesmo
Descompilando o .class ele coloca imports específicos para cada classe usada mesmo que no .java original utilize o *
Sim… não discordo de seus argumentos… nem quero ser teimoso nem nada… sei disto tudo que você disse… há… e sim fiz o teste importando com * novamente e ele voltou a demorar um pouco mais…
Com pequenos apliações quando se importa por exemplo somente o java.awt.* javax.swing.* e mais alguns… a velocidade não muda tanto mas quando você utiliza muitos imports… diga coisa de mais de 10 imports do modo * … dai a diferença aumenta…
O que eu sei que demora mais é o javac. Depois disso, as classes são sempre referenciadas pelo seu nome completo (numa tabela, é bem complicado), portanto no arquivo .class já não dá pra saber se o programador importou .* ou não.
Quando vc for fazer um teste de velocidade, vc sempre tem que executá-lo milhares de vezes. Tipo, rodar a versão com import * 10 mil vezes e ver quanto tempo levou, depois fazer a mesma coisa com a outra. Assim, as minúsculas diferenças de tempo do SO não vão influenciar no seu resultado.
Outras coisas que vc pode testar também é limitar o máximo ou exagerar o tamanho inicial da heap do java, pra ver se a quantidade de memória influencia.
Não é que eu queira duvidar de você, mas… eu duvido!! :roll:
[quote=“isaac”]Sim… não discordo de seus argumentos… nem quero ser teimoso nem nada… sei disto tudo que você disse… há… e sim fiz o teste importando com * novamente e ele voltou a demorar um pouco mais…
Com pequenos apliações quando se importa por exemplo somente o java.awt.* javax.swing.* e mais alguns… a velocidade não muda tanto mas quando você utiliza muitos imports… diga coisa de mais de 10 imports do modo * … dai a diferença aumenta…
Bem … no meu caso obtive diferença nos testes …
[/quote]
com CERTEZA tem algo errado ai. ou voce esta usando uma versao do java 1.1 ou anterior, ou seu marcador de tempo esta te enganado
Estou na do nosso amigo Paulo Silveira…acredito que quando vc faz aplicações pequenas o tal javax.swing.* não tem efeito…mas quando a aplicação eh grande, fica dificil, pois se torna mais lento, o compilador procura a classe que esta sendo usada, como ja foi dito, dai se torna lento o java…sei disso pois tivemos alguns problemas na minha empresa em relação a isso,e foi adotado como padrao “economia de imports”, ou seja, importar soh o que precisar… :lol:
[quote=“richardpeder”]Estou na do nosso amigo Paulo Silveira…acredito que quando vc faz aplicações pequenas o tal javax.swing.* não tem efeito…mas quando a aplicação eh grande, fica dificil, pois se torna mais lento, o compilador procura a classe que esta sendo usada, como ja foi dito, dai se torna lento o java…sei disso pois tivemos alguns problemas na minha empresa em relação a isso,e foi adotado como padrao “economia de imports”, ou seja, importar soh o que precisar… :lol:
Ate mais…[/quote]
mas o q quero dizer eh que o import * soh deixa mais lento o compilador. e mesmo assim, eh IMPERCEPTIVEL
Quando vc escreve Iterator, o javac vai olhar sua lista de imports inteira!! Não somente até encontrar a classe java.util.Iterator, ele vai olhar se existe alguma ambiguidade. Com os imports acima, vc tem que especificar qual é a List que vc tá usando, a java.awt.List ou a java.util.List. Ele não assume que o primeiro match serve.
A execução do programa não depende de imports, como o Paulo afirmou. O bytecode é idêntico, porque um código assim:
import java.util.*;
...
Map m = new HashMap();
...
Set s = m.keySet();
Iterator it = s.iterator();
Gera um bytecode idêntico a esse:
// nada de imports
...
java.util.Map m = new java.util.HashMap();
java.util.Set s = m.keySet();
java.util.Iterator it = s.iterator();
em suma: imports são um recurso TEXTUAL usado pelo compilador, jamais em tempo de execução.
Não estou querendo ser teimoso mas… repeti meus testes novamente 50 vezes com três aplicações… fim isto com o relógio do computaor do lado contando os segundos … utilizo o java 1.4.0 baixado do site da sun para linux… e o 1.4.1 pra windows…
a primeira aplicação abriu em 3 segundos… importando somente o que utilizo demorou menos de 1… na verdade aparece na tela instantanio…
a segunda… esta mais pesada levou 14 segundos… depois de importar somente o necessário levou 9…
a terceira de 17 e baixou pra 10 …
utilizo um computador COMPAQ Pentium 4 de 1.5 GHz com 128 de RAM…
Concordo com o que voçês falaram… mas depois de ficar testando a tarde toda 50 vezes no windows e mais 50 no linux cada programa… bem… eu vi a diferença na prática… não se ja fizeram testes assim… se fizeram e continuou a mesma coisa dai eu não sei… no meu caso deu diferença…
a questao nao eh ficar dependente do programa p/ fazer import p/ vc…
qdo vc compila, o proprio java te diz q nao reconhece alguma classe q vc tenha usado sem importar…
a questao eh com essas ferramentas q auto-importam (websphere, claro) vc tem um ganho de produtividade e de tempo, o q eh fundamental qdo se trabalha numa fabrica de software…