2015-02-04 4 views
2

현재 두 개의 클래스가 동일한 패키지에있는 인 API로 작업하고 있습니다. 하나의 클래스에서 둘 다 사용하고자 할 때, 두 경우 모두에서 너무 긴 패키지 중 하나에 대해 절대 패키지 경로를 지정해야합니다. 긴 절대 경로를 사용하지 않고 두 클래스를 사용하는 다른 방법이 있습니까? 예를 들어 import 문에 대한 별칭을 사용하면 다음과 같이 사용할 수 있습니다. alias.className.Java의 모호한 클래스 이름

+1

이 API는 정말 좋지 않거나 정말 똑똑한 것 같습니다. 두 클래스를 모두 사용할 수 있다고 확신합니까? 그것은 의도적 일 것입니다. 어떤 도서관입니까? –

+0

클래스 중 하나에서'static' 메소드를 호출하려면 클래스 자체를 가져 오지 않고이 메소드에'static import'를 사용할 수 있습니다 ... – Holger

+0

to'@ QPaysTaxes' - appengine 캘린더 API (캘린더 포함) 서비스 및 캘린더 모델로 사용). 사실이 클래스 중 하나를 한 번만 사용해야합니다. 비슷한 상황을 피하기 위해 자바에서 우아한 언어의 특정 메커니즘이 있는지 궁금합니다. – matoni

답변

4

순수 Java가 아니고 아니요. 다른 언어를 사용하면 그렇게 할 수 있지만 Java를 사용하면 하나를 가져 와서 다른 클래스의 정규화 된 이름을 사용하면됩니다.

+1

특히 Groovy는 근본적으로 동적 유형의 Java 버전이며 거의 동일한 구문을 사용하므로 형식 별칭을 지원합니다. – chrylis

0

당신은 수입이 같은 이름을 가진 클래스와 그들에게 자격이를 사용할 수 없으며, 자바 그러한 앨리어싱 메커니즘이 없습니다.

클래스 중 하나를 정규화 된 이름으로 참조하고 다른 클래스 만 가져와야합니다.

고객님의 경우에는 패키지 이름이 더 길고 다른 패키지 이름은이고 다른 이름은 정규화 된 이름으로 사용하십시오.

1

방금 ​​같은 문제가 다시 발생하여 별칭처럼 작동하는 간단한 래퍼에 클래스를 래핑하면 쉽게 해결할 수 있습니다.

public class AbstractAlias<T> { 
    private final T o; 

    public AbstractAlias(T o) { this.o = o; } 

    public T get() { return o; } 

    @Override public boolean equals(Object obj) { return o.equals(obj); } 
    @Override public int hashCode() { return o.hashCode(); } 
} 

예를 들어, 일반적인 구조 MyAlias를 사용하여 콘크리트 "별칭"서브 클래스에게

public class MyAlias extends AbstractAlias<long.class.path.ClassName> { 
    public MyAlias(long.class.path.ClassName o) { 
     super(o); 
    } 
} 

만들기 Map

public void Map<String,MyAlias> createMap() { 
    Map<String,MyAlias> map = new HashMap<>(); 
    // ... 
    return map; 
}