Curiosidade acerda dos imports

37 respostas
Bruno_Cardoso

Boas,

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…

PEACE!

37 Respostas

mlopes

Fala.

Não tem diferença, mas é bom usar imports para as classes que vc usa para tornar o código mais fácil de ler.

Aqui onde eu trabalho vc deve importar explicitamente se não forem mais de 5 classes, caso contrário… tudo bem.

Sei la de onde veio esse número mas…

[]'s

Bani

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.

Bruno_Cardoso

Era assim mesmo que eu imaginava que funcionassem, agora tenho a confirmação. Obrigado pessoal. :wink:

PEACE!

I

Ola…

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…

T+…

Bani

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:

  1. Dizem que é assim que funciona e alegam ter feitos teste
  2. O tamanho do class gerado em ambos os casos é exatamente o mesmo
  3. Descompilando o .class ele coloca imports específicos para cada classe usada mesmo que no .java original utilize o *
I

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 …

Valeu…
T+++

Bani

Bom, quando estiver em casa e com as ferramentas adequadas faço um diff nos arquivos então :wink:

E só pra ter certeza, você está usando o compilador oficial da Sun?

dukejeffrie

Também acho muito estranho isso, isaac…

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:

[]s

Paulo_Silveira

“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 …

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

ele gera o bytecode IDENTICO.

precisa procurar o que eh.

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…

Paulo_Silveira

“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…

mas o q quero dizer eh que o import * soh deixa mais lento o compilador. e mesmo assim, eh IMPERCEPTIVEL

dukejeffrie

Correção: dependendo da sua máquina, é imperceptível… :smiley:

por exemplo, um form normal feito em swing tem vários tipos de imports:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.text.*;
import javax.swing.table.*;
import java.util.*;

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.

R

galera, negocio eh o seguinte…

usem o IBM Websphere w ele jah faz todos os import´s p/ vc…simples…

falow

dukejeffrie

:splat:

Claro!!! Melhor não saber nada e depender do programa do que se virar em qualquer lugar…

Fala sério, Barioni… queimou seu filme…

O JEdit também tem plugins pra brincar com os imports…

[]s

I

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…

Valeu… t+

R

dukejeffrie

o JEdit tem servidor embutido tb??
tem code completion??
tem browser proprio tb??

I

dukejeffrie…

concordo com voçê … fica escravo de um programa pra pode fazer imports … fala sério

usa o JEdit…
usa o JEdit…
usa o JEdit…
usa o JEdit…

R

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…

soh isso.

I

rbarioni

o JEdit tem servidor embutido tb??

Se você está falando do TonCat …
tem

tem code completion??

se você está falando de completar o código automático…
tem…

tem browser proprio tb??

Também tem…

O JEdit tem plugim pra tudo que você precisa… só não tem o IDE que na verdade não tem muita necessidade…

R

isaac…

nao to falando de Tomcat nao…isso eh facil embutir numa ferramenta de desenvolvimento…
falo de servidor interno proprio…o JEdit nao tem…

nao adianta resmungar, cara…
websphere eh a MELHOR ferramenta de desenvolvimento e ponto-final…

thiagorani

Pessoal,

Cada um tem sua preferencia, a minha voces podem notar no meu avatar qual é.
Todas os IDEs atualmente tentam otimizar ao maximo o desenvolvimento. Embora para isso seja necessario um desenvolvedor que saiba conceitos, particularidades, estruturas e etc…
Oq adiantaria dar uma maquina com WebSphere para um Jardineiro? Nada.
A questao nao é ser escravo de IDE algum, e sim saber aondi se pode chegar com as “vantagens” que essas ferramentas trazem para o desenvolvedor.
Isso nao é ser escravo ou acomodado, apenas evolucao tecnologica!

[]´s

Paulo_Silveira

“isaac”:
rbarioni

O JEdit tem plugim pra tudo que você precisa… só não tem o IDE que na verdade não tem muita necessidade…

tem um plugin DECENTE pra usar CVS?
nao

eh rapido?
nao

tem um refactoring absurdo?
nao

tem plugin para desenhar o UMl das suas classes?
nao

Eclipse tem
Ja fui usuario Jedit, o duke sabe. E adorava demais da conta. MAs o eclipse detona. Tipo, eh animal demais.

dukejeffrie

Um tempo atrás, eu conheci um cara que era fã do vi (aquele suposto editor de texto).

Nossos diálogos eram assim:

(duke) - Putz, vi não!!

  • Meu, Vi rules!
  • Fala sério, usa pelo menos o emacs
  • o vi cabe num disquete de 5 1/4
  • e daí?
  • todo o UNIX tem vi, até os podres. Se vc sabe usar o vi, vc nunca vai ficar sem editor de texto.
  • e daí? Eu nunca vou precisar saber mexer no VI porque UNIXes toscos já eram.

Errei feio. Aqui na empresa, fizemos uma distribuição Linux que ocupa 30Mb de memória para rodar numa maquininha. O único editor que tem lá é o vi.

Hoje eu sei que tem milhares de plugins pro vi, de forma que dá pra fazer code completion de java e tudo.

Quando vc trabalha numa fábrica de software, onde vc não tem tempo para raciocinar sobre o seu código, beleza. Mas se você tem tempo…

O que o “mágico” Websphere usa quando vc escreve List? Ele te pergunta ou escolhe uma aleatoriamente?

Isaac, a hora que eu tiver tempo vou testar pra ver. Como vc mediu o tempo??

R

caro Paulo…

se vc adora o Eclipse, entao vai amar o Websphere…

sugiro q vc experimente codificar nele…

ate mais.

Paulo_Silveira

“rbarioni”:
se vc adora o Eclipse, entao vai amar o Websphere…

WSAD eh a versao PAGA do eclipse
eu falei PAGA? hegehehhehe. TO FORA!

prefiro o VI que um editor PAGO que vai me deixar na mao quando outra empresa falar que eu nao posso usar tal editor.

R

verdade Paulo…

mas vale a pena tentar conseguir uma versao crack do websphere…ele eh fantastico…

eu tive acesso ao websphere 5.0…simplesmente demais…
precisa de maquina, mas compensa…

richardpeder

Com certeza Paulo…coisa PAGA tem que cair fora…mas tb ja vi o WebSphere e vale a pena…o Eclipse tb eh bom, free…existem as opções…é só escolher!!!

Ate mais…

Rafael_Steil

Viu no que da?? vc falou em CRACK!! e ja comecou a pirataria…

Rafael

Rafael_Steil

Coloque o codigo das aplicacoes em algum lugar ( nao esta mensagem, se tiver muitas linhas ), para que possamos testar tambem.

Rafael

I

Bem… Infelismente não tenho permissão para passar todo o código fonte da aplicação…

Sobre o tempo de execução dos programas… bem, eu já formei minha opinião em cima de meus testes… não estou dizendo pro pessoal usar assim… apenas coloquei minha opinião baseada em fatos… como já disse o fonte não posso passar… mas se quiserem perguntar algo ou alguma dúvida…

A respeito dos editores… respeito a opinião de todos… cada um programa na ferramenta que se sentir mais avontade e mais agil… quem programa com Websphere e acha que desenvolve rápido… tudo bem, qume usa Jedit e acha que programa rápido tudo bem… que usa VI tudo bem… acho que somos todos adultos…não precisamos agora ficar brigando por questão de editor de texto… a única filosofia que deve ser levada em consideração neste caso é a do Software Livre… Assim penso eu…

T+

ozielneto

Pessoal o que acontece é o seguinte.

Quando se usa o “*” nas cláusulas de import, o compilador ficara mais lento sim, e quem quiser ter uma idéia real basta testar isso:

javac MyClass -verbose

Dessa forma, durante a compilação, serão exibidas as classes que foram referenciadas no byteCode da MyClass e o tempo total de compilação.

Entretanto, durante o Runtime, o tempo de carga ou execução da aplicação não será alterado. Provavelmente a medida de tempo adotada esta errada e precisa ser refeita.

Uma observação. Na JDK 1.4, a API do SWING é carregado INTEIRO na memoria da JVM mesmo se não estiver em uso, pois ela usa um novo conceito de “Shared Libraries”, para diminuir o consumo de memória quando se tem mais de uma JVM sendo executada ao mesmo tempo na mesma máquina, o que pode interferir na medição de tempo de execução.

Paulo_Silveira

isaac
agora voce nao tem como contestar

quem acaba de te responder essa mensagem eh o Oziel Neto, instrutor dos instrutores da SUN

Oziel, a gente fica MUITO contente que voce esteja participando do forum!

richardpeder

é isso mesmo ozielNeto…como eu ja havia colocado em uma msg anterior neste tópico e voltando a colocar minha opinião, e pelo que vejo está certo, nas clausulas import, acredito que deve ser importando apenas as classes que usamos…se vamos usar, por exemplo, somente a JOptionPane do swing, pra que fazer isso…

import javax.swing.*;

É muito mais simples vc importar somente a classe que vai usar…as vezes, usamos varias classes e dai usamos o * para nao ficar importando uma a uma, mas acho que se for uma aplicação grande, e no caso, o amigo ozielNeto disse, e como ele é instrutor dos instrutores da SUN, pode haver mudança na performance na compilação…fico com essa idéia mesmo…economia de imports…vamos importar apenas o que usamos…é melhor, mesmo que na hora da execução nao mude, mas acredito que um código mais enxuto é sempre bem vindo não é mesmo!!! :wink: Essa é minha opinião!! :smiley:

Ate mais amigos…

ozielneto

Srs. Para não ficarmos com esse assunto indefinido, sugiro o seguinte:

1 - Usar sempre os imports específicos, salvo alguma orientação sobre padronagem adotada dentro da fábrica de software.
Prós: Facilita o entendimento do código.
Diminui o tempo de compilação.

Contras:
          Torna a codifição mais complexa, pois a cada nova classe referenciada, é necessário rever os imports.

2 - Independente da JVM, o import java.util.*; não vai forçar a carga de todo o pacote util, e suas dependências. Isso acontece somente com o SWING e somente na JDK 1.4.

Vale lembrar que a linguagem Java foi criada com o intuito "de ser facilmente inteligível".

Eu, por "prequiça e facilidade de uso", prefiro import java.util.*, até porque dentro das IDEs, elas costumam usar essas clausulas para os serviços de "Code Assistance", e etc.

[]´s

dukejeffrie

Eu decompilei um .class com o Jade e adivinha o que eu vi??
:shock:

import java.util.*;

Será que isso tava no bytecode ou o Jade que fez isso na hora de descompilar??

[]s

ozielneto

O “*” foi o JAD que arbritrariamente colocou, pois provavelmente ele encontrou classes que ele não consegui indetificar pos estão fora do CLASSPATH.

EX:
Código original…

package com.cpqd.util.nameservices;

import javax.ejb.<em>;

import java.util.</em>;

import javax.naming.<em>;

import java.rmi.</em>;

import javax.rmi.<em>;

import javax.sql.</em>;

import javax.mail.*;

Código descompilado com a m… do JAD.
// Decompiled by DJ v3.2.2.67 Copyright 2002 Atanas Neshkov Date: 24/3/2003 17:37:16
// Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: NameService.java

package com.cpqd.util.nameservices;

import java.util.Hashtable;

import javax.ejb.EJBHome;

import javax.mail.Session;

import javax.naming.*;

import javax.rmi.PortableRemoteObject;

import javax.sql.DataSource;

Bom estudo a todos.

dukejeffrie

“ozielneto”:
O “*” foi o JAD que arbritrariamente colocou, pois provavelmente ele encontrou classes que ele não consegui indetificar pos estão fora do CLASSPATH.

// Decompiled by DJ v3.2.2.67 Copyright 2002 Atanas Neshkov Date: 24/3/2003 17:37:16
// Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: NameService.java

Acho que na verdade, aquela opção “packimports(3)” diz pra ele usar * quando tiver 3 ou mais classes do mesmo pacote na lista de imports…

O que é, na minha opinião, ótimo! Mais de 10 entradas numa lista de imports é ridículo, a menos que vc esteja mesmo usando 10 pacotes. Por exemplo, uma GUI normal de swing bem feita poderia incluir:

import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.JOptionPane;
import javax.swing.JComponent;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import javax.swing.BorderFactory;

import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;

import java.awt.BoderLayout;
import java.awt.GridLayout;
import java.awt.Container;
import java.awt.Color;
import java.awt.Rectangle;

import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.ItemEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.ActionListener;

// agora exagerando&#58;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Collections;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

Graças a Deus não temos que importar as classes do java.lang!! Esse não é um exemplo real, mas poderia ser. Repare que eu só coloquei coisas relevantes, e não estou imaginando uma interface gerada com NetBeans ou outro editor de GUI (pois nesse caso eu recomendo usar sempre GridBagLayout).

Em vez de 28 linhas de import, eu poderia escrever:

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.beans.*;

Imagine a confusão pra saber se uma classe está importada ou não se eu não tivesse, de cara, organizado os imports por pacote. Pra quem usa Eclipse, blz, é só mais um ícone no gutter. Os outros precisam recorrer a recursos de busca.

[]s!
P.S.: estou procurando alguém que me ensine a escrever mensagens pequenas. Pago em latas de Coca-cola (cheias, claro). :roll:

Criado 6 de março de 2003
Ultima resposta 25 de mar. de 2003
Respostas 37
Participantes 11