Pythonでは、次のことができます。
from a import b as c
衝突している2つのインポートがあるので、Javaでこれをどのように行いますか。
Pythonでは、次のことができます。
from a import b as c
衝突している2つのインポートがあるので、Javaでこれをどのように行いますか。
回答:
Javaにはインポートエイリアスメカニズムはありません。同じ名前の2つのクラスをインポートして、両方を修飾なしで使用することはできません。
1つのクラスをインポートし、もう1つのクラスの完全修飾名を使用します。
import com.text.Formatter;
private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
import [fully-qualified-name] as [ident]
。「as」キーワードはJavaにも適合しないようですimport [ident] = [fully-qualified-name]
。代わりに、C#が使用するものとほぼ同じです。
他の回答がすでに述べたように、Javaはこの機能を提供していません。
この機能の実装は、JDK-4194542:クラス名のエイリアスまたはJDK-4214789:インポートを拡張してインポートされたタイプの名前を変更できるようにするなど、複数回要求されています。
コメントから:
これは不必要な要求ではありませんが、必須ではありません。完全修飾名をときどき使用しても、過度の負担にはなりません(ライブラリが実際に同じ単純な名前を左右に再利用しない限り、これは悪いスタイルです)。
いずれにしても、言語の変更に対する価格/パフォーマンスの基準を超えていません。
そのため、Javaでこの機能がすぐに表示されなくなると思います:-P
Groovyにこの機能があることはおそらく注目に値します。
import java.util.Calendar
import com.example.Calendar as MyCalendar
MyCalendar myCalendar = new MyCalendar()
import com.example.{Calendar => MyCalendar}
import com.example.Calendar as MyCalendar
。
class MyCalendar extends com.example.Calendar {}
どうですか?それは理想的またはきれいではありませんが、たとえば、反射を除くほとんどの目的に役立つはずです。のように、必要に応じてコメントを付加することもでき/* import com.example.Calendar as MyCalendar */
ます。
今日、私はこのエイリアス機能についてOpenJDKにJEPドラフトを提出しました。彼らがそれを再考することを望みます。
興味がある場合は、JEPドラフトをここで見つけることができます:https : //gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7
実際にショートカットを作成して、次のようなコードを使用してコードで短い名前を使用することができます。
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つの点は、実装クラスに抽象基本クラスと同じ名前を付けて、別の名前空間に配置できることです。ただし、インポート/名前変更のパターンとは無関係です。