Ändern Sie den Importnamen in Java oder importieren Sie zwei Klassen mit demselben Namen

363

In Python können Sie Folgendes ausführen:

from a import b as c

Wie würden Sie dies in Java tun, da ich zwei Importe habe, die zusammenstoßen.

Federer
quelle
19
Ich wünschte, Java hätte das getan. Führt zu Klassen mit unangenehmen Namen.
Fncomp
2
@fncomp: ..und chaotischer Code mit vielen voll qualifizierten Klassennamen: P
Superole
2
Java 12 hat dies immer noch nicht
Janac Meena

Antworten:

463

In Java gibt es keinen Import-Aliasing-Mechanismus. Sie können nicht zwei Klassen mit demselben Namen importieren und beide nicht qualifiziert verwenden.

Importieren Sie eine Klasse und verwenden Sie den vollständig qualifizierten Namen für die andere, d. H.

import com.text.Formatter;

private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
Bozho
quelle
16
Das ist die richtige Antwort, und dazu möchte ich nur das hinzufügen, was Sie impliziert haben: Nein, in Java gibt es keine solche Aliasing-Syntax.
Sean Owen
19
Ist dies in Java 8 immer noch eine Einschränkung?
HairOfTheDog
8
@HairOfTheDog Nein, leider wurde kein Import-Aliasing in Java8 hinzugefügt
AdrieanKhisbe
12
Ja, ich stimme Ihrem Kommentar zu linuxdan ... Java hat den Weg des Dinosauriers in Bezug auf Aktualisierungen seiner Syntax gegangen.
Kevin Parker
6
@Bozho So wie Python : import [fully-qualified-name] as [ident]. Das Schlüsselwort "as" scheint nicht auch in Java zu passen. Eine Alternative ist ungefähr das, was C # verwendet : import [ident] = [fully-qualified-name].
Daniel H
60

Wie in den anderen Antworten bereits erwähnt, bietet Java diese Funktion nicht an.

Die Implementierung dieser Funktion wurde mehrfach angefordert, z. B. als JDK-4194542: Aliasing von Klassennamen oder JDK-4214789: Import erweitern, um das Umbenennen des importierten Typs zu ermöglichen .

Aus den Kommentaren:

Dies ist keine unangemessene, wenn auch kaum notwendige Bitte. Die gelegentliche Verwendung voll qualifizierter Namen ist keine unangemessene Belastung (es sei denn, die Bibliothek verwendet dieselben einfachen Namen rechts und links wirklich wieder, was ein schlechter Stil ist).

In jedem Fall wird die Preis- / Leistungsgrenze für einen Sprachwechsel nicht überschritten.

Ich denke, wir werden diese Funktion in Kürze nicht mehr in Java sehen :-P

siegi
quelle
15
Beeindruckend! Sie machten keine Witze über "nicht (...) bald", ich sehe, dass die Feature-Anfrage bereits 1998 als sinnloser Zucker abgetan wurde! Und jeder Versuch, die Diskussion in den letzten 18 Jahren wieder zu eröffnen, ist auf einen Hinweis auf diese alte Entscheidung zurückzuführen. Ich denke, es wäre einfacher, IDE-Entwickler davon zu überzeugen, dies als Maske im Editor zu implementieren, als zu versuchen, Oracle einen Sinn zu geben.
Superole
2
Die alte Argumentation ist jedoch richtig - in der Praxis treten diese Zusammenstöße sehr selten auf.
schlank
14
Ich stimme nicht zu, dass diese Zusammenstöße selten auftreten. Die Objektorientierung begünstigt eine einfache Benennung. Ich kann eine Klasse Mitarbeiter aus zwei verschiedenen Bibliotheken haben, die (zum Beispiel) getrennte Dinge mit einem Mitarbeiter machen.
Andrei Epure
6
@slim " In der Praxis treten diese Zusammenstöße sehr selten auf ". Es ist mir nicht klar , warum diese Situationen weniger häufig in Java auftreten würden als in anderen Sprachen (wo man 10.000+ Klassen haben kann) (wo Sie in der Regel weniger Klassen) , die tun diese „Zucker“ Syntax unterstützen.
Alain Pannetier
21
Absolut falsch. Ich stehe vor einem sehr einfachen Szenario, das wahrscheinlich sehr häufig ist und in dem dieser syntaktische Zucker äußerst hilfreich wäre. Übersetzung zwischen verwandten, aber unterschiedlichen Objektmodellen (die in verwandten, aber jeweils unterschiedlichen Produkten verwendet werden), deren Klassen meistens denselben Namen haben. Für den Übersetzungsprozess müssen Sie auf beide Klassen im selben Codeblock verweisen. In einem solchen Fall (der sehr häufig sein muss) macht Java das Leben sehr schwierig. Nur die Anzahl der Aufrufe in diesem Beitrag sollte Ihnen die Geschichte erzählen.
hrshi1990
59

Es ist wahrscheinlich erwähnenswert, dass Groovy diese Funktion hat :

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

MyCalendar myCalendar = new MyCalendar()
sfussenegger
quelle
15
In Scala ist es:import com.example.{Calendar => MyCalendar}
Pablisco
24
Und in Kotlin : import com.example.Calendar as MyCalendar.
KevinO
14
In PHP ist es: benutze com \ example \ Calendar als MyCalendar
matang
19
Es ist ziemlich ärgerlich zu sehen, dass (mindestens) 3 JVM-basierte Sprachen (Groovy, Scala & Kotlin) diese Funktion haben, aber Java selbst immer noch nicht ...
Matthias
2
Was ist mit so etwas class MyCalendar extends com.example.Calendar {}? Es ist nicht ideal oder hübsch, aber es sollte den meisten Zwecken dienen, beispielsweise nicht der Reflexion. Sie können es bei Bedarf sogar mit einem Kommentar voranstellen, z /* import com.example.Calendar as MyCalendar */.
Braden Best
21

Java erlaubt Ihnen das nicht. Sie müssen auf eine der Klassen mit ihrem vollständig qualifizierten Namen verweisen und nur die andere importieren.

sepp2k
quelle
-4

Tatsächlich ist es möglich, eine Verknüpfung zu erstellen, damit Sie kürzere Namen in Ihrem Code verwenden können, indem Sie Folgendes tun:

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

Auf diese Weise müssen Sie den langen Namen nur einmal angeben, und Sie können so viele speziell benannte Klassen haben, wie Sie möchten.

Eine andere Sache, die ich an diesem Muster mag, ist, dass Sie die implementierende Klasse genauso wie die abstrakte Basisklasse benennen und sie einfach in einem anderen Namespace platzieren können. Dies hängt jedoch nicht mit dem Import- / Umbenennungsmuster zusammen.

4thex
quelle
18
Dies ist eine sehr schlechte Lösung. Es kann sich nicht mit Statik befassen, erfordert möglicherweise ständige Aktualisierungen und hilft nicht bei De- / Serialisierungsproblemen (z. B. Deserialisieren von XML über Jaxb).
Software Engineer