O único problema é que ele atrapalha seu espaço de nomes local. Por exemplo, digamos que você esteja escrevendo um aplicativo Swing e, portanto java.awt.Event
, precise e também esteja em interface com o sistema de calendário da empresa com.mycompany.calendar.Event
. Se você importar os dois usando o método curinga, uma dessas três coisas acontece:
- Você tem um conflito total de nomes entre
java.awt.Event
e com.mycompany.calendar.Event
, portanto, não pode nem compilar.
- Na verdade, você consegue importar apenas uma (apenas uma de suas duas importações importa
.*
), mas é a errada e luta para descobrir por que seu código está afirmando que o tipo está errado.
- Quando você compila seu código, não existe
com.mycompany.calendar.Event
, mas quando eles adicionam mais tarde, seu código válido anteriormente pára subitamente de compilar.
A vantagem de listar explicitamente todas as importações é que eu posso dizer rapidamente qual classe você pretende usar, o que simplesmente facilita a leitura do código. Se você está apenas fazendo uma coisa rápida e pontual, não há nada explicitamente errado , mas os futuros mantenedores agradecerão sua clareza.
Aqui está um voto para importações em estrela. Uma declaração de importação pretende importar um pacote , não uma classe. É muito mais limpo importar pacotes inteiros; os problemas aqui identificados (por exemplo,
java.sql.Date
vsjava.util.Date
) são facilmente remediados por outros meios, não são realmente abordados por importações específicas e certamente não justificam importações insanamente pedantes em todas as classes. Não há nada mais desconcertante do que abrir um arquivo de origem e ter que percorrer 100 instruções de importação.Fazer importações específicas dificulta a refatoração; se você remover / renomear uma classe, precisará remover todas as suas importações específicas. Se você alternar uma implementação para uma classe diferente no mesmo pacote, precisará corrigir as importações. Embora essas etapas extras possam ser automatizadas, elas realmente atingem a produtividade sem nenhum ganho real.
Mesmo que o Eclipse não fizesse importações de classe por padrão, todo mundo continuaria fazendo importações em estrela. Sinto muito, mas realmente não há justificativa racional para fazer importações específicas.
Veja como lidar com conflitos de classe:
fonte
Foo
, e se eu leio seu código sem usar um IDE (já que seu argumento é que eu não deveria ter que usar um), como saberei de qual pacoteFoo
veio ? Claro, usando um IDE, o IDE me dirá, mas todo o seu argumento é que eu deveria poder ler o código sem um. Fazer importações explícitas ajuda a documentar o código (excelente motivo para evitar caracteres curinga) , e é muito mais provável que eu esteja lendo o código sem usar um IDE, do que escrevendo o código sem usar um IDE.consulte o meu artigo Import on Demand is Evil
Em suma, o maior problema é que seu código pode quebrar quando uma classe é adicionada a um pacote que você importa. Por exemplo:
No Java 1.1, tudo bem; A lista foi encontrada em java.awt e não houve conflito.
Agora, suponha que você verifique seu código que funciona perfeitamente e, um ano depois, alguém o traz para editá-lo e está usando o Java 1.2.
O Java 1.2 adicionou uma interface chamada List ao java.util. ESTRONDO! Conflito. O código que funciona perfeitamente não funciona mais.
Este é um recurso do idioma EVIL . Há NO razão que código deve parar de compilar apenas porque um tipo é adicionado a um pacote ...
Além disso, torna difícil para um leitor determinar qual "Foo" você está usando.
fonte
java.util.List
vsjava.awt.List
não é tão ruim de entender, mas tente quando o nome da classe forConfiguration
e várias bibliotecas de dependência o adicionaram em sua versão mais recente do repositório maven.É não ruim para usar um wild card com uma declaração de importação Java.
Em Código Limpo , Robert C. Martin realmente recomenda usá-los para evitar longas listas de importação.
Aqui está a recomendação:
fonte
atuação : nenhum impacto no desempenho, pois o código de bytes é o mesmo. embora isso leve a algumas despesas gerais de compilação.
Compilação : na minha máquina pessoal, compilar uma classe em branco sem importar nada leva 100 ms, mas a mesma classe ao importar java. * Leva 170 ms.
fonte
import java.*
não importa nada. Por que isso faria diferença?Isso atrapalha seu espaço de nome, exigindo que você especifique completamente todos os nomes de classe ambíguos. A ocorrência mais comum disso é com:
Também ajuda a tornar suas dependências concretas, pois todas as dependências estão listadas na parte superior do arquivo.
fonte
A maioria dos lugares em que trabalhei que usam qualquer quantidade significativa de Java faz com que importações explícitas façam parte do padrão de codificação. Às vezes, ainda uso * para prototipagem rápida e, em seguida, expanda as listas de importação (alguns IDEs também farão isso por você) ao produzir o código.
fonte
Eu prefiro importações específicas, porque elas permitem ver todas as referências externas usadas no arquivo sem examinar o arquivo inteiro. (Sim, eu sei que não mostrará necessariamente referências totalmente qualificadas. Mas eu as evito sempre que possível.)
fonte
Em um projeto anterior, descobri que a mudança de importações * para importações específicas reduzia o tempo de compilação pela metade (de cerca de 10 minutos para cerca de 5 minutos). O * -import faz com que o compilador pesquise cada um dos pacotes listados para uma classe correspondente à que você usou. Embora esse tempo possa ser pequeno, ele contribui para grandes projetos.
Um efeito colateral da importação * era que os desenvolvedores copiavam e colavam linhas de importação comuns em vez de pensar no que precisavam.
fonte
No livro DDD
E se ele confunde o espaço de nomes local, a culpa não é sua - culpe o tamanho do pacote.
fonte
Não há impacto no tempo de execução, pois o compilador substitui automaticamente o * por nomes de classes concretos. Se você descompilar o arquivo .class, nunca o verá
import ...*
.O C # sempre usa * (implicitamente), pois você pode apenas o
using
nome do pacote. Você nunca pode especificar o nome da classe. Java introduz o recurso após c #. (Java é tão complicado em muitos aspectos, mas está além deste tópico).No Intellij Idea, quando você "organiza importações", ele substitui automaticamente várias importações do mesmo pacote por *. Esse é um recurso obrigatório, pois você não pode desativá-lo (embora possa aumentar o limite).
O caso listado pela resposta aceita não é válido. Sem * você ainda tem o mesmo problema. Você precisa especificar o nome do pakcage no seu código, independentemente de você usar * ou não.
fonte
Para o registro: Ao adicionar uma importação, você também indica suas dependências.
Você pode ver rapidamente quais são as dependências dos arquivos (excluindo classes do mesmo espaço para nome).
fonte
O mais importante é que a importação
java.awt.*
pode tornar seu programa incompatível com uma versão futura do Java:Suponha que você tenha uma classe chamada "ABC", esteja usando o JDK 8 e importando
java.util.*
. Agora, suponha que o Java 9 seja lançado e tenha uma nova classe no pacotejava.util
que por coincidência também seja chamada de "ABC". Seu programa agora não será compilado no Java 9, porque o compilador não sabe se, com o nome "ABC", você quer dizer sua própria classe ou a nova classe emjava.awt
.Você não terá esse problema quando importar apenas essas classes explicitamente
java.awt
daquilo que realmente usa.Recursos:
Importações Java
fonte
Stream
como um exemplo de uma nova classe adicionada em Java no java.util no Java 8 ... #Entre todos os argumentos válidos dos dois lados, não encontrei o principal motivo para evitar o curinga: gosto de poder ler o código e saber diretamente o que são todas as classes, ou se a definição não está no idioma ou no idioma. o arquivo, onde encontrá-lo. Se mais de um pacote for importado com *, preciso procurar em cada um deles para encontrar uma classe que não reconheço. A legibilidade é suprema e eu concordo que o código não deve exigir um IDE para lê-lo.
fonte