파이썬에서 당신은 할 수 있습니다 :
from a import b as c
충돌하는 두 가지 가져 오기가 있으므로 Java에서 어떻게해야합니까?
파이썬에서 당신은 할 수 있습니다 :
from a import b as c
충돌하는 두 가지 가져 오기가 있으므로 Java에서 어떻게해야합니까?
답변:
Java에는 가져 오기 앨리어싱 메커니즘이 없습니다. 동일한 이름을 가진 두 개의 클래스를 가져올 수 없으며 둘 다 규정되지 않은 상태로 사용할 수 있습니다.
한 클래스를 가져오고 다른 클래스의 정규화 된 이름을 사용하십시오.
import com.text.Formatter;
private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
import [fully-qualified-name] as [ident]
. “as”키워드는 Java에도 적합하지 않은 것 같습니다. 대안은 대략 C #에서 사용하는 것 import [ident] = [fully-qualified-name]
입니다.
다른 답변에서 이미 언급했듯이 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 */
있습니다.
오늘 저는이 앨리어싱 기능에 대해 JEP 초안을 OpenJDK에 제출했습니다. 나는 그들이 그것을 재고하기를 바랍니다.
관심이 있으시면 여기에서 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();
}
}
그런 식으로 긴 이름을 한 번만 지정하면되며 원하는만큼 이름이 지정된 클래스를 가질 수 있습니다.
이 패턴에 대해 좋아하는 또 다른 점은 구현 클래스의 이름을 추상 기본 클래스와 동일하게 지정하고 다른 네임 스페이스에 배치 할 수 있다는 것입니다. 그러나 가져 오기 / 이름 바꾸기 패턴과는 관련이 없습니다.