A verdade é que vc NÃO PRECISA usar import
se não quiser. Considere:
import java.util.List;
import java.util.ArrayList;
import java.time.LocalTime;
class Teste {
public static void main(String[] args) {
List<LocalTime> localTimes = new ArrayList<>();
localTimes.add( LocalTime.now() );
}
}
O código acima poderia ser reescrito sem import
s:
class Teste {
public static void main(String[] args) {
java.util.List<java.time.LocalTime> localTimes =
new java.util.ArrayList<>();
localTimes.add( java.time.LocalTime.now() );
}
}
Talvez vc esteja pensando neles como um requerimento que deveria ser desnecessário sendo que, na verdade, é uma facilidade muito bem vinda.
Acho que todos concordamos que pacotes (ou equivalentes em outras linguagens) são um recurso essencial, né? Eles nos permitem organizar melhor nosso código, evitam conflitos de nomes e, no caso do Java, ainda nos auxiliam nas nossas estratégias de encapsulamento (uma vez que nos permitem definir entidades que só são visiveis de dentro daquele pacote).
Pois bem, só que eles vão um pouco além disso. Todas as entidades declaradas em nosso programa (com algumas exceções) tem o que a especificação define como Simple Name
e um Full Qualified Name
.
O Simple Name é o nome usado para se referir a uma certa entidade de dentro do escopo na qual ela foi declarada.
O Full Qualified Name é usado para se referir a uma certa entidade de fora do contexto onde ela foi declarada.
E o pacote onde uma entidade foi declarada faz parte deste Full Qualified Name.
O que o import
faz é nos permitir usar uma entidade qualquer fora do escopo de declaração dela a partir de seu Simple Name.
O compilador (e talvez até a JVM) poderia inferir qual entidade querermos usar com base no nosso código? Poderia.
Considere:
package um;
public class Teste {
public void fazAlgumaCoisa() {}
}
E
package dois;
public class Teste {
public void fazOutraCoisa() {}
}
E
package tres;
public class Programa {
public static void main(String[] args) {
Teste teste = new Teste();
teste.fazAlgumaCoisa();
}
}
Tenho duas classes com nome igual, mas em pacotes diferentes e o compilador poderia muito bem dizer que o Teste
que quero é o que está dentro do pacote um
, já que é o único que possui um método chamado fazAlgumaCoisa
.
Porém, será que é mesmo o único? Será que meu classpath não possui mais nenhuma outra biblioteca que tenha uma classe com este nome e com um método igual? Vc poderia afirmar isso com toda certeza do mundo?
Eu particularmente só poderia afirmar isso se eu conhecesse muito bem cada biblioteca, cada framework e cada ferramenta instalada no meu computador (o que já seria mais trabalhoso ou chato ou inconveniente do que usar import
s).
Mesmo assim eu ainda não seria capaz de dizer o mesmo do computador do meu cliente, ou dos meus clientes. Se meu programa vai rodar só na minha máquina, funcionaria bem, mas em geral programas serão distribuidos por ai.
Deixar que o compilador infira o tipo da entidade que queremos traria mais problemas e preocupações do que fazer o programador usar o Full Qualified Name ou alguns import
s.
Fonte: https://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html