Javaでのインポート名の変更、または同じ名前の2つのクラスのインポート


363

Pythonでは、次のことができます。

from a import b as c

衝突している2つのインポートがあるので、Javaでこれをどのように行いますか。


19
私はJavaがこれをしたことを望みます。扱いにくい名前を持つクラスにつながります。
fncomp 2013年

2
@fncomp:..そして完全に修飾されたクラス名がたくさんある厄介なコード:P
Superole

2
Java 12にはまだこれがありません
Janac Meena

回答:


463

Javaにはインポートエイリアスメカニズムはありません。同じ名前の2つのクラスをインポートして、両方を修飾なしで使用することはできません。

1つのクラスをインポートし、もう1つのクラスの完全修飾名を使用します。

import com.text.Formatter;

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

16
それは正しい答えであり、私はあなたが示唆したことだけを追加します。いいえ、Javaにはそのようなエイリアス構文はありません。
ショーンオーウェン

19
これはまだJava 8の制限ですか?
HairOfTheDog

8
@HairOfTheDogいいえ、残念ながらJava8にはインポートのエイリアスが追加されていません
AdrieanKhisbe

12
ええ、私はあなたのコメントlinuxdanに同意します... Javaはその構文の更新に関して恐竜の道を進んでいます。
Kevin Parker

6
@Bozho Pythonが行う方法:import [fully-qualified-name] as [ident]。「as」キーワードはJavaにも適合しないようですimport [ident] = [fully-qualified-name]。代わりに、C#が使用するものとほぼ同じです。
ダニエルH

60

他の回答がすでに述べたように、Javaはこの機能を提供していません。

この機能の実装は、JDK-4194542:クラス名のエイリアスまたはJDK-4214789:インポートを拡張してインポートされたタイプの名前を変更できるようにするなど、複数回要求されています。

コメントから:

これは不必要な要求ではありませんが、必須ではありません。完全修飾名をときどき使用しても、過度の負担にはなりません(ライブラリが実際に同じ単純な名前を左右に再利用しない限り、これは悪いスタイルです)。

いずれにしても、言語の変更に対する価格/パフォーマンスの基準を超えていません。

そのため、Javaでこの機能がすぐに表示されなくなると思います:-P


15
うわー!あなたは「すぐに(...)すぐに」について冗談を言っていませんでした、私は機能要求が1998年までさかのぼって無意味な砂糖として却下されたようです!そして、過去18年間に議論を再開しようとするあらゆる試みは、その古代の決定への言及に立ち往生しています。Oracleを理解しようとするよりも、IDE開発者にこれをエディターのマスクとして実装するように説得する方が簡単だと思います。
Superole 2016

2
古い推論は正しいですが、実際にはこれらの衝突はめったに起こりません。
スリム

14
これらの衝突がめったに発生しないことに同意しません。オブジェクト指向は単純な命名を支持します。(たとえば)従業員と別々のことを行う2つの異なるライブラリからクラスEmployeeを作成できます。
Andrei Epure

6
@slim「実際には、これらの衝突はほとんど発生しません」。(あなたが10.000+クラスを持つことができる場所)これらの状況は(あなたが通常より少ないクラスを持っている)他の言語に比べてJavaでそれほど頻繁に発生する理由は、私には明確ではないこの「糖」構文をサポートしています。
Alain Pannetier

21
間違いです。私はおそらく非常に一般的で、この構文糖が非常に役立つ非常に単純なシナリオに直面しています。関連するが異なるクラスのオブジェクトモデル(関連するが異なる製品でそれぞれ使用されます)間の変換で、クラスのほとんどの場合、同じ名前を共有します。変換プロセスでは、同じコードブロックで両方のクラスを参照する必要があります。そのような場合(これは非常に一般的でなければなりません)、Javaは生活を非​​常に困難にします。この投稿の閲覧数だけで、ストーリーがわかります。
hrshi1990 2017年

59

Groovyにこの機能があることはおそらく注目に値します

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

MyCalendar myCalendar = new MyCalendar()

15
スカラ座では、それはです:import com.example.{Calendar => MyCalendar}
pablisco

24
そして、Kotlinで:import com.example.Calendar as MyCalendar
KevinO 2017年

14
PHPでは次のとおりです。com\ example \ CalendarをMyCalendarとして使用します
Matang

19
(少なくとも)3つのJVMベースの言語(Groovy、Scala、およびKotlin)にこの機能があることを確認するのは非常に面倒ですが、Java自体にはまだ機能しません...
Matthias

2
のようなものはclass MyCalendar extends com.example.Calendar {}どうですか?それは理想的またはきれいではありませんが、たとえば、反射を除くほとんどの目的に役立つはずです。のように、必要に応じてコメントを付加することもでき/* import com.example.Calendar as MyCalendar */ます。
ブレーデンベスト

21

Javaではそれを行うことはできません。クラスの1つを完全修飾名で参照し、他のクラスのみをインポートする必要があります。



-4

実際にショートカットを作成して、次のようなコードを使用してコードで短い名前を使用することができます。

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

このようにして、長い名前を1回指定するだけでよく、特別な名前のクラスをいくつでも持つことができます。

このパターンについて私が気に入っているもう1つの点は、実装クラスに抽象基本クラスと同じ名前を付けて、別の名前空間に配置できることです。ただし、インポート/名前変更のパターンとは無関係です。


18
これは非常に貧弱なソリューションです。それは完全に静的を処理することに失敗し、絶え間ない更新を必要とする可能性があり、逆シリアル化の問題(xmlからjaxbを介した逆シリアル化など)の助けにはなりません。
ソフトウェアエンジニア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.