Altere o Nome da importação em Java ou importe duas classes com o mesmo nome

363

No Python, você pode fazer um:

from a import b as c

Como você faria isso em Java, como eu tenho duas importações que estão em conflito.

Federer
fonte
19
Eu gostaria que o java fizesse isso. Leva a classes com nomes estranhos.
Fncomp
2
@fncomp: ..e código confuso com vários nomes de classes completamente qualificados: P
Superole
2
Java 12 ainda não tem isso
Janac Meena

Respostas:

463

Não há mecanismo de alias de importação em Java. Você não pode importar duas classes com o mesmo nome e usar as duas não qualificadas.

Importe uma classe e use o nome completo para a outra, ou seja,

import com.text.Formatter;

private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
Bozho
fonte
16
Essa é a resposta certa e, para isso, apenas acrescentaria o que você sugeriu: não, não existe uma sintaxe de alias em Java.
Sean Owen
19
Isso ainda é uma limitação no Java 8?
HairOfTheDog
8
@HairOfTheDog Não, infelizmente não aliasing importação foram adicionados em Java8
AdrieanKhisbe
12
Sim, eu concordo com o seu comentário linuxdan ... Java seguiu o caminho do dinossauro em termos de atualizações de sua sintaxe.
Kevin Parker
6
@Bozho A maneira python faz: import [fully-qualified-name] as [ident]. O “como” palavra-chave não parecem se encaixar em Java, bem como, uma alternativa é aproximadamente o que C # usos: import [ident] = [fully-qualified-name].
21715 Daniel Daniel H
60

Como as outras respostas já indicadas, Java não fornece esse recurso.

A implementação desse recurso foi solicitada várias vezes, por exemplo, como JDK-4194542: aliasing do nome da classe ou JDK-4214789: Estenda a importação para permitir renomear o tipo importado .

Dos comentários:

Este não é um pedido irracional, embora dificilmente essencial. O uso ocasional de nomes totalmente qualificados não é um fardo indevido (a menos que a biblioteca realmente reutilize os mesmos nomes simples, à direita e à esquerda, o que é um estilo ruim).

De qualquer forma, não ultrapassa os limites de preço / desempenho para uma alteração de idioma.

Então, acho que não veremos esse recurso em Java tão cedo :-P

siegi
fonte
15
Uau! você não estava brincando sobre "não (...) tão cedo", vejo que o pedido de recurso foi descartado como açúcar inútil já em 1998! E todas as tentativas de reabrir a discussão nos últimos 18 anos se perderam em uma referência a essa decisão antiga. Eu acho que seria mais fácil convencer os desenvolvedores de IDE a implementar isso como uma máscara no editor do que tentar acertar o Oracle.
Superole 28/09/16
2
O antigo raciocínio está correto - na prática, esses confrontos raramente ocorrem.
magro
14
Não concordo que esses confrontos raramente ocorram. A orientação a objetos favorece a nomeação simples. Eu posso ter uma classe Employee de duas bibliotecas diferentes que separam as coisas com um empregado (por exemplo).
Andrei Epure 23/03
6
@slim " na prática esses confrontos raramente ocorrem ". Não está claro para mim por que estas situações iria ocorrer com menos freqüência em java (onde você pode ter 10.000+ classes) do que em outras línguas (onde você geralmente têm menos classes) que fazem suportar esta sintaxe "açúcar".
Alain Pannetier
21
Absolutamente incorreto. Estou diante de um cenário muito simples que provavelmente é muito comum e onde esse açúcar sintático seria extremamente útil. Tradução entre modelos de objetos relacionados, mas distintos (usados ​​em produtos relacionados, mas diferentes, respectivamente) cujas classes compartilham o mesmo nome na maioria das vezes. O processo de conversão requer que você consulte as duas classes no mesmo bloco de código. Nesse caso (que deve ser muito comum), Java torna a vida muito difícil. Apenas o número de visualizações nesta postagem deve contar a história.
hrshi1990 12/06
59

Provavelmente vale a pena notar que o Groovy possui esse recurso :

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

MyCalendar myCalendar = new MyCalendar()
sfussenegger
fonte
15
Em Scala, é:import com.example.{Calendar => MyCalendar}
pablisco
24
E em Kotlin: import com.example.Calendar as MyCalendar.
KevinO
14
No PHP é: use com \ example \ Calendar como MyCalendar
até
19
É muito irritante ver que (pelo menos) 3 linguagens baseadas em JVM (Groovy, Scala & KOTLIN) têm esta característica, mas o próprio Java ainda não ...
Matthias
2
Que tal algo assim class MyCalendar extends com.example.Calendar {}? Não é ideal ou bonito, mas deve servir a muitos propósitos, exceto, digamos, reflexão. Você pode até anexá-lo com um comentário, se necessário, como /* import com.example.Calendar as MyCalendar */.
Braden Melhor
21

Java não permite que você faça isso. Você precisará se referir a uma das classes pelo nome completo e importar apenas a outra.

sepp2k
fonte
-4

Na verdade, é possível criar um atalho para que você possa usar nomes mais curtos no seu código, fazendo algo assim:

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

Dessa forma, você só precisa especificar o nome longo uma vez e pode ter quantas classes especialmente nomeadas desejar.

Outra coisa que eu gosto nesse padrão é que você pode nomear a classe de implementação da mesma forma que a classe base abstrata e apenas colocá-la em um espaço para nome diferente. Isso não está relacionado ao padrão de importação / renomeação.

4thex
fonte
18
Esta é uma solução muito ruim. Falha completamente ao lidar com estática, pode exigir atualizações constantes e não ajuda com problemas de des serialização (como desserialização do xml pelo jaxb).
Software Engineer