Java에서 가져 오기 이름 변경 또는 동일한 이름의 두 클래스 가져 오기


363

파이썬에서 당신은 할 수 있습니다 :

from a import b as c

충돌하는 두 가지 가져 오기가 있으므로 Java에서 어떻게해야합니까?


19
자바가 이것을하기를 바랍니다. 어색한 이름을 가진 클래스로 연결됩니다.
fncomp 2018 년

2
@fncomp : .. 정규화 된 클래스 이름이 많은 지저분한 코드 : P
Superole

2
Java 12는 여전히 이것을 가지고 있지 않습니다
Janac Meena

답변:


463

Java에는 가져 오기 앨리어싱 메커니즘이 없습니다. 동일한 이름을 가진 두 개의 클래스를 가져올 수 없으며 둘 다 규정되지 않은 상태로 사용할 수 있습니다.

한 클래스를 가져오고 다른 클래스의 정규화 된 이름을 사용하십시오.

import com.text.Formatter;

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

16
그것은 정답이며, 당신이 암시 한 것을 추가 할 것입니다 : 아니요, Java에는 그러한 앨리어싱 구문이 없습니다.
Sean Owen

19
이것은 여전히 ​​Java 8의 제한 사항입니까?
HairOfTheDog

8
불행히도 수입 앨리어싱이 Java8에 추가되어 있지 않은 @HairOfTheDog 아니,
AdrieanKhisbe

12
그래, 나는 당신의 의견 linuxdan에 동의합니다 ... Java는 구문의 업데이트 측면에서 공룡의 길을 갔다.
Kevin Parker

6
@Bozho 파이썬이하는 방식 : import [fully-qualified-name] as [ident]. “as”키워드는 Java에도 적합하지 않은 것 같습니다. 대안은 대략 C #에서 사용하는 것 import [ident] = [fully-qualified-name]입니다.
Daniel H

60

다른 답변에서 이미 언급했듯이 Java는이 기능을 제공하지 않습니다.

이 기능의 구현은 JDK-4194542 : 클래스 이름 앨리어싱 또는 JDK-4214789 : 가져온 유형의 이름을 바꿀 수 있도록 가져 오기 확장 과 같이 여러 번 요청되었습니다 .

의견에서 :

거의 필수는 아니지만, 이것은 비합리적인 요청이 아닙니다. 정규화 된 이름을 가끔 사용하는 것은 과도한 부담이 아닙니다 (라이브러리가 실제로 동일한 단순한 이름을 오른쪽과 왼쪽으로 재사용하지 않는 한 나쁜 스타일입니다).

어쨌든 언어 변경에 대한 가격 / 성능 기준을 통과하지 못합니다.

그래서 우리는 Java 에서이 기능을 곧 볼 수 없을 것입니다 :-P


15
와! "언제나 (...)"라는 농담을하지 않았다면 1998 년까지 기능 요청이 무의미한 설탕으로 기각 된 것입니다! 지난 18 년 동안 토론을 다시 시작하려는 모든 시도는 그 고대의 결정에 대한 언급에 좌초되었습니다. IDE 개발자가 Oracle에 익숙해지기보다 편집기에서 마스크로 이것을 구현하도록 설득하는 것이 더 쉽다고 생각합니다.
Superole

2
오래된 추론은 맞습니다. 실제로 이러한 충돌은 거의 발생하지 않습니다.
슬림

14
이러한 충돌이 거의 발생하지 않는다는 데 동의하지 않습니다. 객체 방향은 단순한 이름 지정을 선호합니다. 직원과 별도의 작업을 수행하는 두 개의 서로 다른 라이브러리에서 직원 클래스를 가질 수 있습니다 (예 :).
Andrei Epure

6
@slim " 실제로 이러한 충돌은 거의 발생하지 않습니다 ". (당신이 10.000+ 수업을 할 수있는) 이러한 상황은 (당신이 일반적으로 덜 수업을) 다른 언어보다 자바에서 자주 발생하는 이유는 나에게 분명하지 않다 이 "설탕"구문을 지원합니다.
Alain Pannetier가

21
절대적으로 맞지 않습니다. 나는 매우 일반적인 시나리오에 직면하고 있으며 아마도이 구문 설탕이 매우 도움이 될 것입니다. 대부분의 클래스가 동일한 이름을 공유하는 관련이 있지만 고유 한 객체 모델 (각각 관련성이 있지만 서로 다른 제품에 사용됨) 간 변환 변환 프로세스에서는 동일한 코드 블록에서 두 클래스를 모두 참조해야합니다. 이러한 경우 (매우 일반적이어야 함) Java는 인생을 매우 어렵게 만듭니다. 이 게시물의 조회수 만 이야기를 알려줍니다.
hrshi1990

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

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 */있습니다.
Braden Best

21

Java는 그렇게 할 수 없습니다. 정규화 된 이름으로 클래스 중 하나를 참조하고 다른 클래스 만 가져와야합니다.



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

그런 식으로 긴 이름을 한 번만 지정하면되며 원하는만큼 이름이 지정된 클래스를 가질 수 있습니다.

이 패턴에 대해 좋아하는 또 다른 점은 구현 클래스의 이름을 추상 기본 클래스와 동일하게 지정하고 다른 네임 스페이스에 배치 할 수 있다는 것입니다. 그러나 가져 오기 / 이름 바꾸기 패턴과는 관련이 없습니다.


18
이것은 매우 가난한 솔루션입니다. 정적 처리에 완전히 실패하고 지속적인 업데이트가 필요할 수 있으며 직렬화 해제 문제 (예 : xml에서 jaxb까지 직렬화 해제 등)에는 도움이되지 않습니다.
소프트웨어 엔지니어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.