同じ名前の2つのクラスをインポートします。処理する方法?


107

私が次のようなコードを持っているとしましょう:

import java.util.Date;
import my.own.Date;

class Test{

  public static void main(String [] args){

    // I want to choose my.own.Date here. How?
    ..
    // I want to choose util.Date here. How ?

  }
}

完全修飾クラス名にする必要がありますか?importステートメントを削除できますか?このようなシナリオは現実のプログラミングでは一般的ですか?


実際の質問への回答ではありませんが、C#では任意の名前空間のエイリアスを使用できます。
多分

回答:


153

importステートメントを省略して、パス全体を使用して参照することができます。例えば:

java.util.Date javaDate = new java.util.Date()
my.own.Date myDate = new my.own.Date();

しかし、同じ名前の2つのクラスと同様の関数を使用することは、どれがどれであるかを明確にできない限り、通常は最善のアイデアとは言えません。


2
Eclipseを使用している場合はyour.own.Date、ctrl + shift + R を使用して名前を変更できます。これにより、コードで参照するすべての場所と、ファイル(およびファイル名)であるyour / own / Date.javaで自動的に変更されます。他のIDEにもおそらく同様の機能があります。
MatrixFrog 2010年

16
私は最後の声明に同意しません。独自のDateクラスを設計する場合Dateは、これが最適な名前です。ほとんどのコードで使用します。ただし、java.util.Date両方の間で変換を行うために、特にを呼び出す必要がある場合があります。
パラダイム

2
@MatrixFrog指定したEclipseの機能は、Netbeans IDEによっても提供されます。この機能は「リファクタリング」と呼ばれています。あなたの情報は間違っていませんでしたが、尋ねられた質問の答えではありません。彼(ロジャー)がそのコードを開発している場合、彼は間違いなく自分のクラスの名前を変更またはリファクタリングできることを知っています。彼が求めていることはあなたが与えた答えとは異なります。
Yatendra Goel、2010

11
@ヤテンドラそれが私が答えではなくコメントとしてそれを追加した理由です。エリーPが彼女の回答の最後に述べた点を拡大していました。ロジャーはおそらくそれを知っていますが、SOの目的は、質問をした人だけでなく、他の開発者を助けることです。IDE機能を知らない人は、手動で名前を切り替えるのは不可能だと思うかもしれないので、その情報を入れておくと便利だと思いました。
MatrixFrog 2010年

5
私の最も頻繁な名前の衝突はorg.apache.log4j.Loggerおよびで発生しjava.util.logging.Loggerます。通常、私はどちらか一方を制御できません。レガシーコードの統合を行っています。
kevinarpe 2015

21

クラスをインポートする代わりに完全修飾名を使用します。

例えば

//import java.util.Date; //delete this
//import my.own.Date;

class Test{

   public static void main(String [] args){

      // I want to choose my.own.Date here. How?
      my.own.Date myDate = new my.own.Date();

      // I want to choose util.Date here. How ?
      java.util.Date javaDate = new java.util.Date();
   }
}

6
ベストプラクティスは、最も使用
頻度

10

はい、同じ単純名でクラスをインポートする場合、完全修飾クラス名でクラスを参照する必要があります。他の開発者がファイルを操作しているときに、ファイルの内容を理解できるようにするため、私はインポート文をそのままにしておきます。

java.util.Data date1 = new java.util.Date();
my.own.Date date2 = new my.own.Date();

7

それを行う別の方法はそれをサブクラス化することです:

package my.own;

public class FQNDate extends Date {

}

そして、java.util.Dateを持つパッケージにmy.own.FQNDateをインポートします。


私はこれが好きです(それは簡単です)が、静的メソッドへのアクセスなどの問題には対処していません。
Justin Ohms 2013年

Hamcrest MatchersとMockito Matchersを同じクラスで使用したい場合は、常にこれを行います。静的メソッドで動作するようです。
Adam Burley

@Kidburlaは、どのマッチャーがどこから来たかを気にしない限り、静的インポートを使用することもできます。私はしばしばこれをマッチャーや.whens、.thenReturnsなどの単体テストで行います- Mockito.膨張を取り除きます。
CptBartender 2016

これは悪い習慣です。元のクラスから一部の機能が拡張されていない限り、クラスを拡張しないでください。
パルタ

3

独自の日付クラスがある場合は、組み込みの日付クラスと区別する必要があります。つまり、なぜ自分で作成したのですか。ImmutableDate、BetterDate、NanoDateのようなもの、さらにはMyDateでも、独自の日付クラスがある理由が示されます。この場合、一意の名前が付けられます。


3

それらの1つをインポートを使用してインポートできます。その他すべての同様のクラスでは、完全修飾クラス名を指定する必要があります。そうしないと、コンパイルエラーが発生します。

例えば:

import java.util.Date;

class Test{

  public static void main(String [] args){

    // your own date
    my.own.Date myOwndate ;

    // util.Date
    Date utilDate;
  }
}

2

このシナリオは実際のプログラミングではそれほど一般的ではありませんが、それほど奇妙でもありません。異なるパッケージの2つのクラスが同じ名前で、両方が必要な場合があります。

2つのクラスの名前が同じである場合、両方に同じ機能が含まれる必要はなく、どちらか一方のみを選択する必要があります。

両方が必要な場合、それを使用しても害はありません。そして、それも悪いプログラミングの考えではありません。

しかし、参照しているクラスも明確にするために、クラスの完全修飾名(同じ名前を持つ)を使用する必要があります。

:)


2

たとえば、あるクラスを別のクラスにマッピングするとき(個人データを表すために新しいクラスのセットに切り替えるときなど)、この問題に遭遇しました。この時点で、両方のクラスが必要になります。これは、コードの要点であり、一方を他方にマップするためです。また、どちらの場所でもクラスの名前を変更することはできません(ここでも、ジョブはマップすることであり、他の誰かが行ったことを変更することではありません)。

完全修飾は一方向です。たとえば、Javaは "Person"の意味を心配するため、両方のインポートステートメントを実際に含めることはできないようです。


2

2つの異なるパッケージから同じクラス名を本当に使用したい、または使用する必要がある場合は、2つのオプションがあります

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

import my.own.Date;

class Test{

     public static void main(String[] args){

        // I want to choose my.own.Date here. How?
        //Answer:
        Date ownDate = new Date();

        // I want to choose util.Date here. How ?
        //Answer:
        java.util.Date utilDate = new java.util.Date();

     }
}


2-常に完全修飾クラス名を使用します。

//no Date import
class Test{

  public static void main(String[] args){

    // I want to choose my.own.Date here. How?
    //Answer:
     my.own.Date ownDate = new my.own.Date();
    // I want to choose util.Date here. How ?
    //Answer:
     java.util.Date utilDate = new java.util.Date();

  }
}

0

私は同じ問題を抱えていました、私がやったこと、私はライブラリの順序を順番に並べました、例えばjava.lang.NullPointerExceptionとjavacard.lang.NullPointerExceptionがありました。最初のライブラリをデフォルトのライブラリとして作成しましたが、もう1つを使用する必要がある場合は、完全修飾クラス名を明示的に指定できます。


0

同じ名前のクラスを呼び出すときは、クラスの呼び出し元のパッケージを明示的に指定する必要があります。

あなたはこのようにすることができます:

import first.Foo;

public class Main {
    public static void main(String[] args) {
        System.out.println(new Foo());
        System.out.println(new second.Foo());
    }
}



package first;

public class Foo {
    public Foo() {
    }

    @Override
    public String toString() {
        return "Foo{first class}";
    }
}



package second;

public class Foo {
    public Foo() {
    }

    @Override
    public String toString() {
        return "Foo{second class}";
    }
}

出力:

Foo{first class}
Foo{second class}

スクリーンショットのコードを回答に含めてください。
Thomas Landauer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.