2011-03-15 6 views
8

최근에 "와일드 카드 가져 오기를 절대로 사용해서는 안됩니다."와 같은 문구를 너무 자주 들었습니다. 그래서 나는 지역 사회에 이것에 대해 물어보고 싶다. 와일드 카드 가져 오기가 실제로 Java 프로덕션 코드에서 절대 사용되지 않아야합니다. 이 규칙에 예외가 있습니까? 개인적인 경험과 의견에 관심이 있습니다. 생산 코드에서이 코드를 사용하고 다른 사람들에게 권장합니까? 어떻게 사용합니까? 최선의 방법을 추천 해 줄 수 있습니까?Java 및 Scala에서 와일드 카드 사용을 가져옵니다.

Scala 관점에서 보면 흥미로울 것입니다. Scala에도 똑같은 내용이 적용됩니까? 스칼라에서 와일드 카드 가져 오기는 프리젠 테이션 슬라이드와 SO 답변에서만 사용해야합니다. 나는 그것이 또한 중요 일반적으로 와일드 카드를 가져 암시 적 변환을 고려하는 생각

import scalaz._ 
import Scalaz._ 

:

당신이 scalaz page에서 보면됩니다

예를 들어, 그들은 같은 와일드 카드 수입의 사용을 권장합니다.

+20

"절대로하면 안되는"것으로 시작하는 조언을 들어야합니다. – musiKk

+0

@musiKk : 노력하고 있습니다 :)하지만 너무 자주 듣는다면 자신을 의심 할 것입니다 ... – tenshi

+0

@musiKk, "너는 결코 ... 너무 자주는 안된다"라고하는 조언을 듣지 말아야합니다.) –

답변

12

스칼라에서는 대부분의 라이브러리가 암시 적 변환을 범위에 포함 할 것으로 기대하기 때문에 와일드 카드 가져 오기가 필수이지만 항상 편리하게 명명되지는 않습니다.

import collection.JavaConversions.{asJavaConcurrentMap,enumerationAsScalaIterator,...} 

믿을 수 없을만큼 어색 반면 그래서,

import collection.JavaConversions._ 

은 좋은 생각이다. 스칼라에서는 다음과 같이 범위를 지정하여 가져올 수 있습니다.

package mypackage { 
    class MyClass { 
    def myGraphicalWidgetHandler { 
     import java.awt._ 
     ... 
    } 
    ... 
    } 
    ... 
} 

이렇게하면 전체 파일에서 네임 스페이스가 어지럽게 정리됩니다. 그리고 당신은 선택적으로 당신이 충돌 알고 수입의 일부의 이름을 바꿀 수 있습니다 :

import java.awt.{List => AwtList, _} 

대조적을, 자바, 당신은 수입 전역 범위로 제한하고 있으며, 당신은 그 이름을 바꿀 수 없습니다; 당신은 암묵적인 변환도하지 않으므로, 당신이 찾고있는 것들만 끌어들일 수 있습니다. 반면에, 당신은 당신이 찾고있는 클래스를 찾고 당신을 위해 그것을 가져 오는 데 도움이 될 것입니다 강력한 IDE 지원을했습니다. 따라서 Java의 경우, 모든 것을 잡으려고 결심하는 대신 필요한 것만으로 IDE를 끌어 넣어야한다는 합리적인 논의가 있습니다. 개인적으로, 나는 여전히이 너무 어색하고 그냥 와일드 카드 수입을 사용하는 대부분의 시간을 찾습니다.

+1

나는이 기능을 Java (Scoping + Renaming) 용으로 원한다. – Stefan

2

자바 측 : 와일드 카드 가져 오기 사용에는 아무런 문제가 없습니다. 실제로 사용되는 클래스 만로드되므로 런타임시 성능 부족이 없습니다.

java의 가져 오기 메커니즘은 컴파일 할 때 발생합니다. 코드 창에서 클래스 Date을 사용하는 경우 동일한 패키지에 클래스 Date이 없으면 가져 오기 메커니즘이 가져 오기 명령문 중 하나에서 클래스 데이터를 찾는 데 사용됩니다.

그래서 모든 것은 "어떤 클래스를 참조하고 있는지 찾아내는 것"입니다. 런타임 성능을 변경할 수있는 것은 없습니다.

+0

Andiaz는 동일한 단순한 이름의 두 클래스가 서로 다른 가져온 패키지에 존재할 경우에만 문제가 발생할 수 있다고 말했습니다. – Chris

+1

성능상의 차이는 없습니다. 그러나 언젠가 빌드 프로세스에서 알 수없는 클래스 Foo에 대해 불평하고 와일드 카드 가져 오기를 사용하면 갑자기 빠진 패키지를 확인하는 것이 좋습니다. 그곳에 갔었 어. – Imre

12

글쎄, 전체 클래스 이름을 지정하면 모호성이 제거됩니다. 따라서 가져올 클래스를 명시 적으로 명시하면 코드의 의도를 훨씬 쉽게 이해할 수 있습니다. Java 1.2도 염두에 둡니다.

import java.util.*; 
import java.awt.*; 

... 
List blah; 

Java 1.1에서는 정상적으로 작동합니다. 그러나 Java 1.2에서는 List 인터페이스가 java.util에 추가되었으며 정상적으로 작동 한 코드는 더 이상 작동하지 않습니다. 많은 개발자들이 울었다.

8

Java에서 와일드 카드를 가져 오거나 사용하지 않는 것은 코드 유지 관리 가능성과 가져 오기 애매한 점을 처리 할 의사가없는 것입니다 (가져온 두 패키지에 같은 이름의 구성원이있는 경우). 다른 한편, 이데올로기의 관점에서 볼 때 전체 패키지 (예 : java.sql._)를 가져 오는 것이 합리적입니다. 일관된 동작을 원하고 동일한 패키지에서 여러 줄의 가져 오기를 피하십시오.

그것의 대부분은 차이, 스칼라 사실이다 :

  1. 코드를 오염되지 같은 클래스에서 여러 멤버를 가져 오려면하고, 동시에 가능한 모호성을 피하기 스칼라는 특별한 문법을 ​​제공한다 : import java.io.{File, FileInputStream};
  2. 스칼라에서는 모호성을 처리하기 위해 가져온 멤버에 별칭을 지정할 수 있습니다. import java.lang.{Double=>JDouble};
  3. 올바르게 언급했듯이 와일드 카드 가져 오기를 사용하면 암시를 컨텍스트에 추가하므로 다른 수준의 모호함이 발생할 수 있습니다 (두 번 생각할 또 다른 이유입니다).

그래서 모든 스칼라의 IMO 와일드 카드 가져 오기 구문은 특정 라이브러리를 사용하여 일관되게 작동하도록하려는 경우에만 사용해야합니다 (Scalaz의 경우에는 모든 필수 구성원, 암시 적 변환 등).

+0

특히 패키지 객체에 정의 된 implicits 가져 오기에 대한 강조를 좋아합니다. –