Importando duas classs com o mesmo nome. Como lidar?

Digamos que eu tenha um código como:

import java.util.Date; import my.own.Date; class Test{ public static void main(String [] args){ // I want to choose my.own.Date here. How? .. // I want to choose util.Date here. How ? } } 

Devo ser nomes de class completos? Posso me livrar das declarações de importação? Esse cenário é comum na programação do mundo real?

Você pode omitir as instruções de importação e referenciá-las usando o caminho inteiro. Por exemplo:

 java.util.Date javaDate = new java.util.Date() my.own.Date myDate = new my.own.Date(); 

Mas eu diria que usar duas classs com o mesmo nome e uma function semelhante geralmente não é a melhor idéia, a menos que você possa deixar bem claro qual é qual.

use o nome totalmente qualificado em vez de importar a class.

por exemplo

 //import java.util.Date; //delete this //import my.own.Date; class Test{ public static void main(String [] args){ // I want to choose my.own.Date here. How? my.own.Date myDate = new my.own.Date(); // I want to choose util.Date here. How ? java.util.Date javaDate = new java.util.Date(); } } 

Sim, ao importar classs com os mesmos nomes simples, você deve se referir a elas por seus nomes de class totalmente qualificados. Gostaria de deixar as instruções de importação, como dá a outros desenvolvedores uma noção do que está no arquivo quando eles estão trabalhando com ele.

 java.util.Data date1 = new java.util.Date(); my.own.Date date2 = new my.own.Date(); 

Outra maneira de fazer isso é subclass:

 package my.own; public class FQNDate extends Date { } 

Em seguida, importe my.own.FQNDate em pacotes que tenham java.util.Date.

Você pode importar um deles usando a importação. Para todas as outras classs semelhantes, você precisa especificar nomes de classs totalmente qualificados. Caso contrário, você receberá um erro de compilation.

Por exemplo:

 import java.util.Date; class Test{ public static void main(String [] args){ // your own date my.own.Date myOwndate ; // util.Date Date utilDate; } } 

Este cenário não é tão comum na programação do mundo real, mas não é tão estranho também. Acontece que, às vezes, duas classs em pacotes diferentes têm o mesmo nome e precisamos de ambas.

Não é obrigatório que, se duas classs tiverem o mesmo nome, ambas contenham as mesmas funcionalidades e devemos escolher apenas uma delas.

Se precisamos de ambos, então não há mal em usar isso. E não é uma má idéia de programação também.

Mas devemos usar nomes totalmente qualificados das classs (que têm o mesmo nome) para deixar claro qual class estamos nos referindo também.

🙂

Se você tem sua própria class de data, você deve distingui-la da class Data incorporada. ou seja, por que você criou o seu próprio? Algo como ImmutableDate ou BetterDate ou NanoDate, até mesmo MyDate indicaria porque você tem sua própria class de data. Nesse caso, eles terão um nome exclusivo.

Eu bato este problema quando, por exemplo, mapeando uma class para outra (como quando se muda para um novo conjunto de classs para representar os dados da pessoa). Nesse ponto, você precisa das duas classs, porque esse é o ponto principal do código – mapear um para o outro. E você não pode renomear as classs em nenhum dos dois locais (novamente, o trabalho é mapear, não mudar o que outra pessoa fez).

Totalmente qualificado é um caminho. Parece que você não pode realmente include as duas instruções de importação, porque o Java fica preocupado com qual “Pessoa” se destina, por exemplo.

Se você realmente quer ou precisa usar o mesmo nome de class de dois pacotes diferentes, você tem duas opções:

Escolha 1 para usar na importação e use o nome completo da class do outro:

 import my.own.Date; class Test{ public static void main(String[] args){ // I want to choose my.own.Date here. How? //Answer: Date ownDate = new Date(); // I want to choose util.Date here. How ? //Answer: java.util.Date utilDate = new java.util.Date(); } } 

2-use sempre o nome completo da class:

 //no Date import class Test{ public static void main(String[] args){ // I want to choose my.own.Date here. How? //Answer: my.own.Date ownDate = new my.own.Date(); // I want to choose util.Date here. How ? //Answer: java.util.Date utilDate = new java.util.Date(); } } 

Acabei de ter o mesmo problema, o que fiz, organizei a ordem da biblioteca em sequência, por exemplo, havia java.lang.NullPointerException e javacard.lang.NullPointerException. Eu fiz o primeiro como uma biblioteca padrão e se você precisava usar o outro, você pode especificar explicitamente o nome completo da class.