이름이 같은 두 개의 클래스를 가져옵니다. 처리하는 방법?


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 ?

  }
}

정규화 된 클래스 이름이어야합니까? 수입 명세서를 제거 할 수 있습니까? 이러한 시나리오가 실제 프로그래밍에서 일반적입니까?


질문에 대한 답은 아니지만 C #에서는 모든 네임 스페이스에 별칭을 사용할 수 있습니다. : 그냥 문법 설탕이지만 정말 helpfull입니다 수 있음 msdn.microsoft.com/en-us/library/7f38zh8x.aspx
borjab

답변:


154

import 문을 생략하고 전체 경로를 사용하여 참조 할 수 있습니다. 예 :

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

그러나 나는 같은 이름과 비슷한 기능을 가진 두 개의 클래스를 사용하는 것은 당신이 어떤 것이 무엇인지 정말로 명확하게 할 수 없다면 일반적으로 최선의 생각이 아니라고 말할 것입니다.


2
Eclipse를 your.own.Date사용하는 경우 ctrl + shift + R 을 사용하여 이름을 변경할 수 있습니다 . 그러면 코드에서 참조하는 모든 곳과 your / own / Date.java 파일 (및 파일 이름)에서 자동으로 변경됩니다. 다른 IDE에는 비슷한 기능이있을 수 있습니다.
MatrixFrog

16
나는 마지막 진술에 동의하지 않는다. 나만의 Date 클래스를 디자인하려는 경우 Date완벽한 이름입니다. 대부분의 코드에서 사용합니다. 그러나 때로는 java.util.Date둘 사이의 변환을 위해 notably를 호출해야 할 수도 있습니다 .
패러다임

2
@MatrixFrog 지정한 Eclipse의 기능은 Netbeans IDE에서도 제공됩니다. 이 기능을 "리팩터링"이라고합니다. 귀하의 정보는 잘못된 것은 아니지만 질문에 대한 답변은 아닙니다. 그가 (Roger) 그 코드를 개발하고 있다면, 그는 자신의 클래스 이름을 변경하거나 리팩토링 할 수 있다는 것을 확실히 알고 있습니다. 그가 묻는 것은 당신이 준 대답과 다릅니다.
Yatendra Goel

11
@Yatendra 그래서 답변이 아닌 댓글로 추가했습니다. 나는 Ellie P.가 그녀의 대답 끝에 말한 요점을 확장하고있었습니다. Roger는 아마도 그것을 알고있을 것입니다. 그러나 SO의 요점은 질문을 한 사람뿐만 아니라 다른 개발자를 돕는 것입니다. 사람들이 IDE 기능에 대해 잘 모르면 이름을 직접 바꾸는 것이 불가능하다고 생각할 수 있으므로 그 정보를 입력하는 것이 유용 할 것이라고 생각했습니다.
MatrixFrog

5
내 가장 흔한 이름 충돌이 발생 org.apache.log4j.Logger하고 java.util.logging.Logger. 일반적으로 나는 한쪽 또는 다른 쪽을 제어 할 수 없습니다. 레거시 코드 통합을하고 있습니다.
kevinarpe

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
모범 사례는 전체 클래스 패스와 함께 가장 많이 사용 하나를 사용하여 가장 많이 사용 하나를 가져 오는 것입니다
Alpaslan

10

예. 동일한 단순 이름을 가진 클래스를 가져올 때 정규화 된 클래스 이름으로 참조해야합니다. 다른 개발자가 작업 할 때 파일에 무엇이 있는지 알 수 있도록 import 문을 그대로 둡니다.

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

저는 같은 클래스에서 Hamcrest Matchers와 Mockito 를 사용하고 싶을 때 항상 이것을합니다 Matchers. 정적 방법으로 작동하는 것 같습니다.
Adam Burley

@Kidburla 당신은 또한 당신이 어느 매 처가 어디에서 왔는지 신경 쓰지 않는 한 정적 가져 오기를 사용할 수 있습니다. 나는 종종 matcher와 .whens, .thenReturns 등에 대한 단위 테스트에서 이것을 수행합니다 .- Mockito.팽창을 제거합니다 .
CptBartender

이것은 나쁜 습관입니다. 원래 클래스에서 일부 기능이 확장되지 않는 한 클래스를 확장해서는 안됩니다.
Partha

3

고유 한 날짜 클래스가있는 경우 기본 제공 날짜 클래스와 구별해야합니다. 즉, 왜 자신을 만들었습니까? ImmutableDate 또는 BetterDate 또는 NanoDate와 같은 것, 심지어 MyDate도 자신의 날짜 클래스가있는 이유를 나타냅니다. 이 경우 고유 한 이름을 갖게됩니다.


3

가져 오기를 사용하여 그중 하나를 가져올 수 있습니다. 다른 모든 유사한 클래스의 경우 정규화 된 클래스 이름을 지정해야합니다. 그렇지 않으면 컴파일 오류가 발생합니다.

예 :

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

예를 들어 한 클래스를 다른 클래스로 매핑 할 때이 문제가 발생했습니다 (예 : 사람 데이터를 나타내는 새로운 클래스 집합으로 전환 할 때). 이 시점에서 두 클래스가 모두 필요합니다. 이것이 코드의 전체 지점이기 때문입니다. 그리고 어느 곳에서나 클래스의 이름을 바꿀 수 없습니다 (다시 말하지만 작업은 다른 사람이 한 작업을 변경하는 것이 아니라 매핑하는 것입니다).

완전한 자격을 갖춘 것은 한 가지 방법입니다. 예를 들어 Java는 "Person"이 어떤 의미인지 걱정하기 때문에 실제로 두 import 문을 모두 포함 할 수 없습니다.


2

두 개의 서로 다른 패키지에서 동일한 클래스 이름을 사용하고 싶거나 사용해야하는 경우 두 가지 옵션이 있습니다.

하나는 가져 오기에 사용할 하나를 선택하고 다른 하나는 정규화 된 클래스 이름을 사용하는 것입니다.

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이 있었다. 첫 번째 라이브러리를 기본 라이브러리로 만들고 다른 라이브러리를 사용해야하는 경우 정규화 된 클래스 이름을 명시 적으로 지정할 수 있습니다.


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.