Importer deux classes avec le même nom. Comment gérer?

Disons que j’ai un code comme:

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

Devrais-je être un nom de classe qualifié complet? Puis-je me débarrasser des déclarations d’importation? Un tel scénario est-il courant dans la programmation du monde réel?

Vous pouvez omettre les instructions d’importation et vous y reporter en utilisant l’intégralité du chemin. Par exemple:

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

Mais je dirais que l’utilisation de deux classes avec le même nom et une fonction similaire n’est généralement pas la meilleure idée à moins que vous ne puissiez vraiment préciser laquelle est qui.

Utilisez le nom complet au lieu d’importer la classe.

par exemple

 //import java.util.Date; //delete this //import my.own.Date; class Test{ public static void main(Ssortingng [] 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(); } } 

Oui, lorsque vous importez des classes avec les mêmes noms simples, vous devez vous y référer par leurs noms de classe complets. Je laisserais les instructions d’importation, car cela donne aux autres développeurs une idée de ce qu’il y a dans le fichier quand ils travaillent avec lui.

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

Une autre façon de le faire est la sous-classe:

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

Et puis importez my.own.FQNDate dans les packages qui ont java.util.Date.

Vous pouvez importer l’un d’eux en utilisant l’importation. Pour toute autre classe similaire, vous devez spécifier des noms de classe pleinement qualifiés. Sinon, vous obtiendrez une erreur de compilation.

Par exemple:

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

Ce scénario n’est pas si courant dans la programmation du monde réel, mais pas trop. Il arrive parfois que deux classes de packages différents portent le même nom et que nous avons besoin des deux.

Il n’est pas obligatoire que si deux classes ont le même nom, les deux contiendront les mêmes fonctionnalités et nous ne devrons en choisir qu’une.

Si nous avons besoin des deux, il n’y a pas de mal à l’utiliser. Et ce n’est pas une mauvaise idée de programmation aussi.

Mais nous devrions utiliser des noms complets des classes (qui ont le même nom) afin de clarifier la classe à laquelle nous faisons référence.

🙂

Si vous avez votre propre classe de date, vous devez la distinguer de la classe Date intégrée. c’est-à-dire pourquoi avez-vous créé le vôtre? Quelque chose comme ImmutableDate ou BetterDate ou NanoDate, même MyDate indiquerait pourquoi vous avez votre propre classe de date. Dans ce cas, ils porteront un nom unique.

Je rencontre ce problème lorsque, par exemple, vous mappez une classe à une autre (par exemple, lorsque vous passez à un nouvel ensemble de classes pour représenter des données de personne). À ce stade, vous avez besoin des deux classes, car c’est l’intérêt du code – pour les mapper les unes aux autres. Et vous ne pouvez pas renommer les classes à chaque endroit (encore une fois, le travail consiste à mapper, pas à changer ce que quelqu’un d’autre a fait).

Entièrement qualifié est un moyen. Il semble que vous ne puissiez pas réellement inclure les deux instructions d’importation, car Java s’inquiète de la signification de “Personne”, par exemple.

Si vous voulez vraiment ou avez besoin d’utiliser le même nom de classe à partir de deux packages différents, vous avez deux options:

1 choix à utiliser dans l’importation et utiliser le nom de classe complet de l’autre:

 import my.own.Date; class Test{ public static void main(Ssortingng[] 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-utilisez toujours le nom de classe complet:

 //no Date import class Test{ public static void main(Ssortingng[] 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(); } } 

J’ai juste eu le même problème, ce que j’ai fait, j’ai arrangé l’ordre de la bibliothèque en séquence, par exemple il y avait java.lang.NullPointerException et javacard.lang.NullPointerException. J’ai créé le premier en tant que bibliothèque par défaut et si vous deviez utiliser l’autre, vous pouvez spécifier explicitement le nom complet de la classe.