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.
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.
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
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.
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.
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.
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).
Antworten:
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.
quelle
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]
.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:
Ich denke, wir werden diese Funktion in Kürze nicht mehr in Java sehen :-P
quelle
Es ist wahrscheinlich erwähnenswert, dass Groovy diese Funktion hat :
quelle
import com.example.{Calendar => MyCalendar}
import com.example.Calendar as MyCalendar
.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 */
.Java erlaubt Ihnen das nicht. Sie müssen auf eine der Klassen mit ihrem vollständig qualifizierten Namen verweisen und nur die andere importieren.
quelle
Heute habe ich OpenJDK einen JEP-Entwurf zu dieser Aliasing-Funktion vorgelegt. Ich hoffe, sie werden es noch einmal überdenken.
Wenn Sie interessiert sind, finden Sie hier einen JEP-Entwurf: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7
quelle
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:
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.
quelle