Importare due classi con lo stesso nome. Come gestire?

Dì che ho un codice come:

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 essere un nome completo della class? Posso sbarazzarmi delle dichiarazioni di importazione? È un tale scenario comune nella programmazione del mondo reale?

È ansible omettere le istruzioni di importazione e fare riferimento a esse utilizzando l’intero percorso. Per esempio:

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

Ma direi che l’uso di due classi con lo stesso nome e una funzione simile di solito non è l’idea migliore a meno che non sia ansible chiarire quale sia.

usa il nome completo invece di importare la class.

per esempio

 //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(); } } 

Sì, quando si importano classi con gli stessi nomi semplici, è necessario fare riferimento a esse mediante i nomi di class completi. Vorrei lasciare le istruzioni di importazione, in quanto dà agli altri sviluppatori un senso di ciò che è nel file quando stanno lavorando con esso.

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

Un altro modo per farlo è sottoclassi:

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

E poi importa my.own.FQNDate in pacchetti che hanno java.util.Date.

Puoi importarne uno usando l’importazione. Per tutte le altre classi simili, è necessario specificare nomi di classi pienamente qualificati. Altrimenti si otterrà l’errore di compilazione.

Per esempio:

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

Questo scenario non è così comune nella programmazione del mondo reale, ma non è così strano. A volte capita che due classi in pacchetti diversi abbiano lo stesso nome e abbiamo bisogno di entrambe.

Non è obbligatorio che se due classi abbiano lo stesso nome, entrambe conterranno le stesse funzionalità e dovremmo sceglierne solo una.

Se abbiamo bisogno di entrambi, allora non c’è nulla di male nell’utilizzarlo. E non è una ctriggers idea di programmazione.

Ma dovremmo usare nomi completi delle classi (che hanno lo stesso nome) per chiarire a quale class ci riferiamo.

🙂

Se hai la tua class data, dovresti distinguerla dalla class Data incorporata. cioè perché hai creato il tuo. Qualcosa come ImmutableDate o BetterDate o NanoDate, anche MyDate potrebbe indicare il motivo per cui hai la tua class data. In questo caso, avranno un nome univoco.

Colpisco questo problema quando, ad esempio, mappo una class a un’altra (ad esempio quando si passa a una nuova serie di classi per rappresentare i dati di una persona). A quel punto, hai bisogno di entrambe le classi perché questo è l’intero punto del codice – per mappare l’una all’altra. E non è ansible rinominare le classi in entrambi i posti (di nuovo, il lavoro è mappare, non cambiare ciò che ha fatto qualcun altro).

Completamente qualificato è a senso unico. Sembra che non sia ansible includere entrambe le istruzioni import, perché Java si preoccupa per quale “Persona” si intende, ad esempio.

Se vuoi veramente o devi usare lo stesso nome di class da due pacchetti diversi, hai due opzioni:

1-sceglierne uno da utilizzare nell’importazione e usa il nome di class completo dell’altro:

 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: usa sempre il nome di class completo:

 //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(); } } 

Ho appena avuto lo stesso problema, cosa ho fatto, ho organizzato l’ordine della libreria in sequenza, ad esempio c’erano java.lang.NullPointerException e javacard.lang.NullPointerException. Ho creato il primo come libreria predefinita e, se è stato necessario utilizzare l’altro, è ansible specificare esplicitamente il nome completo della class qualificata.