Modifica il nome dell'importazione in Java o importa due classi con lo stesso nome


363

In Python puoi fare un:

from a import b as c

Come lo faresti in Java, dato che ho due importazioni che si scontrano.


19
Vorrei che java lo facesse. Conduce a classi con nomi scomodi.
fncomp,

2
@fncomp: ..e codice disordinato con molti
nomi di classe completi

2
Java 12 non ha ancora questo
Janac Meena,

Risposte:


463

Non esiste alcun meccanismo di alias di importazione in Java. Non è possibile importare due classi con lo stesso nome e utilizzare entrambe non qualificate.

Importa una classe e usa il nome completo per l'altra, ad es

import com.text.Formatter;

private Formatter textFormatter;
private com.json.Formatter jsonFormatter;

16
Questa è la risposta giusta e aggiungerei solo ciò che hai insinuato: no, non esiste una sintassi di aliasing simile in Java.
Sean Owen,

19
Questa è ancora una limitazione in Java 8?
HairOfTheDog

8
@HairOfTheDog No, sfortunatamente nessun alias di importazione è stato aggiunto in Java8
AdrieanKhisbe il

12
Sì, sono d'accordo con il tuo commento linuxdan ... Java ha fatto la strada del dinosauro in termini di aggiornamenti della sua sintassi.
Kevin Parker,

6
@Bozho Il pitone modo fa: import [fully-qualified-name] as [ident]. Il “come” parola chiave non sembra per adattarsi in Java e, in alternativa è di circa ciò che # usi C: import [ident] = [fully-qualified-name].
Daniel H,

60

Come già indicato nelle altre risposte, Java non fornisce questa funzione.

L'implementazione di questa funzione è stata richiesta più volte, ad esempio come JDK-4194542: aliasing nome classe o JDK-4214789: Estendi importazione per consentire la ridenominazione del tipo importato .

Dai commenti:

Questa non è una richiesta irragionevole, sebbene difficilmente indispensabile. L'uso occasionale di nomi pienamente qualificati non è un onere eccessivo (a meno che la biblioteca non riutilizzi davvero gli stessi nomi semplici a destra e a sinistra, il che è cattivo stile).

In ogni caso, non passa la barra del prezzo / delle prestazioni per un cambio di lingua.

Quindi suppongo che non vedremo presto questa funzione in Java :-P


15
Wow! non stavi scherzando "non (...) in qualunque momento presto", vedo che la richiesta di funzionalità è stata respinta come zucchero inutile nel lontano 1998! E ogni tentativo di riaprire la discussione durante questi ultimi 18 anni si è bloccato su un riferimento a quella antica decisione. Immagino che sarebbe più facile convincere gli sviluppatori IDE a implementare questo come una maschera nell'editor piuttosto che provare a dare un senso a Oracle.
Superole,

2
Il vecchio ragionamento è corretto però - in pratica questi scontri si verificano molto raramente.
magro,

14
Non sono d'accordo sul fatto che questi scontri si verificano raramente. L'orientamento agli oggetti favorisce la semplice denominazione. Posso avere un dipendente di classe da due diverse librerie che fanno cose separate con un dipendente (per esempio).
Andrei Epure,

6
@slim " in pratica questi scontri si verificano molto raramente ". Non è chiaro perché queste situazioni sarebbe verificato meno frequentemente in java (dove si può avere 10.000+ classi) che in altre lingue (dove di solito hanno meno classi) che fanno sostenere questa sintassi "zucchero".
Alain Pannetier,

21
Assolutamente scorretto Sto affrontando uno scenario molto semplice che è probabilmente molto comune e in cui questo zucchero sintattico sarebbe estremamente utile. Traduzione tra modelli di oggetti correlati ma distinti (utilizzati rispettivamente in prodotti correlati ma diversi) le cui classi condividono il più delle volte lo stesso nome. Il processo di traduzione richiede di fare riferimento a entrambe le classi nello stesso blocco di codice. In tal caso (che deve essere molto comune), Java rende la vita molto difficile. Solo il numero di visualizzazioni su questo post dovrebbe raccontarti la storia.
hrshi1990,

59

Vale probabilmente la pena notare che Groovy ha questa funzione :

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

MyCalendar myCalendar = new MyCalendar()

15
A Scala è:import com.example.{Calendar => MyCalendar}
pablisco

24
E in Kotlin: import com.example.Calendar as MyCalendar.
KevinO

14
In PHP è: usa com \ example \ Calendar come MyCalendar
matang

19
È abbastanza fastidioso vedere che (almeno) 3 lingue basate su JVM (Groovy, Scala e Kotlin) hanno questa funzione, ma Java non lo fa ancora ...
Matthias

2
Che ne dici di qualcosa del genere class MyCalendar extends com.example.Calendar {}? Non è l'ideale o carino, ma dovrebbe servire la maggior parte degli scopi a meno, per esempio, della riflessione. Puoi anche anteporre un commento se necessario, come /* import com.example.Calendar as MyCalendar */.
Braden Best

21

Java non ti consente di farlo. Dovrai fare riferimento a una delle classi con il suo nome completo e importare solo l'altra.



-4

In realtà è possibile creare un collegamento in modo da poter usare nomi più brevi nel codice facendo qualcosa del genere:

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

In questo modo devi solo specificare il nome lungo una volta e puoi avere tutte le classi con nomi speciali che desideri.

Un'altra cosa che mi piace di questo modello è che puoi nominare la classe di implementazione uguale alla classe di base astratta e posizionarla in uno spazio dei nomi diverso. Ciò non è correlato al modello di importazione / ridenominazione.


18
Questa è una soluzione molto scarsa. Non riesce completamente a gestire la statica, può richiedere aggiornamenti costanti e non aiuta con problemi di de / serializzazione (come la deserializzazione da XML a JAXB).
Software Engineer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.