Modifier le nom de l'importation en Java ou importer deux classes avec le même nom

363

En Python, vous pouvez faire:

from a import b as c

Comment feriez-vous cela en Java, car j'ai deux importations qui s'affrontent.

Federer
la source
19
J'aimerais que java fasse ça. Conduit à des classes avec des noms maladroits.
fncomp
2
@fncomp: ..et code désordonné avec beaucoup de
noms de
2
Java 12 n'a toujours pas cela
Janac Meena

Réponses:

463

Il n'y a pas de mécanisme d'importation d'alias en Java. Vous ne pouvez pas importer deux classes avec le même nom et les utiliser sans réserve.

Importez une classe et utilisez le nom complet pour l'autre, c'est-à-dire

import com.text.Formatter;

private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
Bozho
la source
16
C'est la bonne réponse et j'ajouterais seulement ce que vous avez impliqué: non, il n'y a pas une telle syntaxe d'alias en Java.
Sean Owen
19
Est-ce toujours une limitation dans Java 8?
HairOfTheDog
8
@HairOfTheDog Nope, malheureusement aucun alias d'importation n'a été ajouté dans Java8
AdrieanKhisbe
12
Ouais je suis d'accord avec ton commentaire linuxdan ... Java a fait le chemin du dinosaure en termes de mises à jour de sa syntaxe.
Kevin Parker
6
@Bozho Le python ainsi fait: import [fully-qualified-name] as [ident]. Le « comme » mot - clé ne semble pas correspondre à Java, ainsi, une alternative est à peu près ce que C # utilisations: import [ident] = [fully-qualified-name].
Daniel H
60

Comme les autres réponses déjà mentionnées, Java ne fournit pas cette fonctionnalité.

L'implémentation de cette fonctionnalité a été demandée plusieurs fois, par exemple sous la forme JDK-4194542: alias de nom de classe ou JDK-4214789: étendre l'importation pour permettre de renommer le type importé .

D'après les commentaires:

Ce n'est pas une demande déraisonnable, bien que peu essentielle. L'utilisation occasionnelle de noms pleinement qualifiés n'est pas un fardeau indu (à moins que la bibliothèque ne réutilise vraiment les mêmes noms simples à droite et à gauche, ce qui est un mauvais style).

En tout état de cause, il ne passe pas la barre des prix / performances pour un changement de langue.

Donc je suppose que nous ne verrons pas cette fonctionnalité dans Java de si tôt :-P

siegi
la source
15
Hou la la! vous ne plaisantiez pas sur "pas (...) de sitôt", je vois que la demande de fonctionnalité a été rejetée comme du sucre inutile dès 1998! Et chaque tentative de rouvrir la discussion au cours de ces 18 dernières années s'est échouée sur une référence à cette ancienne décision. Je suppose qu'il serait plus facile de convaincre les développeurs IDE d'implémenter cela comme un masque dans l'éditeur que d'essayer de donner un sens à Oracle.
Superole
2
L'ancien raisonnement est cependant correct - en pratique, ces affrontements se produisent très rarement.
slim
14
Je ne suis pas d'accord que ces affrontements se produisent rarement. L'orientation des objets favorise une dénomination simple. Je peux avoir un employé de classe de deux bibliothèques différentes qui font des choses distinctes avec un employé (par exemple).
Andrei Epure
6
@slim " en pratique, ces affrontements se produisent très rarement ". Je ne comprends pas pourquoi ces situations se produiraient moins fréquemment en java (où vous pouvez avoir plus de 10 000 classes) que dans d'autres langues (où vous avez généralement moins de classes) qui prennent en charge cette syntaxe "sucre".
Alain Pannetier
21
Absolument incorrect. Je suis confronté à un scénario très simple qui est probablement très courant et où ce sucre syntaxique serait extrêmement utile. Traduction entre des modèles d'objets liés mais distincts (utilisés respectivement dans des produits liés mais différents) dont les classes partagent la plupart du temps le même nom. Le processus de traduction vous oblige à faire référence aux deux classes dans le même bloc de code. Dans un tel cas (qui doit être très courant), Java rend la vie très difficile. Seul le nombre de vues sur ce post devrait vous raconter l'histoire.
hrshi1990
59

Il est probablement intéressant de noter que Groovy a cette fonctionnalité :

import java.util.Calendar
import com.example.Calendar as MyCalendar

MyCalendar myCalendar = new MyCalendar()
sfussenegger
la source
15
A Scala c'est:import com.example.{Calendar => MyCalendar}
pablisco
24
Et en Kotlin: import com.example.Calendar as MyCalendar.
KevinO
14
En PHP, c'est: utilisez com \ example \ Calendar comme MyCalendar
matang
19
C'est assez ennuyeux de voir que (au moins) 3 langages basés sur la JVM (Groovy, Scala et Kotlin) ont cette fonctionnalité mais Java lui-même n'en a toujours pas ...
Matthias
2
Et quelque chose comme ça class MyCalendar extends com.example.Calendar {}? Ce n'est ni idéal ni joli, mais cela devrait servir la plupart des objectifs, à part, disons, la réflexion. Vous pouvez même l'ajouter avec un commentaire si nécessaire, comme /* import com.example.Calendar as MyCalendar */.
Braden Best
21

Java ne vous permet pas de le faire. Vous devrez vous référer à l'une des classes par son nom complet et importer uniquement l'autre.

sepp2k
la source
-4

En fait, il est possible de créer un raccourci afin que vous puissiez utiliser des noms plus courts dans votre code en faisant quelque chose comme ceci:

package com.mycompany.installer;
public abstract class ConfigurationReader {
    private static class Implementation extends com.mycompany.installer.implementation.ConfigurationReader {}
    public abstract String getLoaderVirtualClassPath();
    public static QueryServiceConfigurationReader getInstance() {
        return new Implementation();
    }
}

De cette façon, vous n'avez besoin de spécifier le nom long qu'une seule fois, et vous pouvez avoir autant de classes spécialement nommées que vous le souhaitez.

Une autre chose que j'aime dans ce modèle est que vous pouvez nommer la classe d'implémentation de la même manière que la classe de base abstraite et la placer simplement dans un espace de noms différent. Cela n'est cependant pas lié au modèle d'importation / renommage.

4thex
la source
18
C'est une très mauvaise solution. Il ne parvient pas à gérer les statistiques, peut nécessiter des mises à jour constantes et n'aide pas avec les problèmes de désérialisation / sérialisation (tels que la désérialisation de xml à jaxb).
Ingénieur logiciel