2008-09-01 6 views
9

일반적인 일반적인 설명을 계속 반복하지 않고도 일반적인 정의를 정의하고 사용하는 약식 방법이 있습니다. 변경 사항이있을 경우 코드베이스에서 예를 들어 모든 정의/용도를 변경할 필요가 없습니다.Java의 Generic

Typedef myGenDef = < Object1, Object2 >; 

HashMap<myGenDef> hm = new HashMap<myGenDef>(); 

for (Entry<myGenDef> ent : hm..entrySet()) 
{ 
. 
. 
. 
} 

답변

11

pseudo-typedef antipattern있다 ...

이 가능처럼 somethhing한다 0
class StringList extends ArrayList<String> { } 

좋은 물건, 마셔! ;-)

이 기술에는 몇 가지 심각한 문제가 있습니다. 주로이 "typedef"는 실제로는 별도의 클래스이므로 확장되는 유형이나 다른 유사하게 정의 된 유형과 호환하여 사용할 수 없습니다.

+0

특히 대안이있을 때 반 패턴을 질문에 대한 해결책으로 받아들이는 것이 좋지 않을 수 있습니다. 그러나 그것이 당신의 특별한 문제로 당신을 도왔다면 ... –

+0

(자바에서 "typedef"쓰레드에 대한 소음에 대한 사회자의 권고를 무시 함) ... 그것은 반 패턴보다 나쁩니다. 가상 메소드 테이블에 자체 항목이있는 새로운 일류 유형을 작성하고 그러한 모든 의무를 작성합니다.C++ typedef는 단순히 "ArrayList "부분을 DRY로 만들므로 한 곳에서만 String (또는 ArrayList)을 변경할 수 있습니다. – Phlip

+0

예, C/C++ typedef는 잘 지원되고 합법적 인 용도로 많이 존경받는 언어 기능입니다. 이것은 아니다. 따라서 전체 "반 패턴"일. – Shog9

1

호 비록, 그루비하는 JVM 언어는, 동적으로 입력하고 당신이 쓸 수 다음과 같습니다 :

def map = new HashMap<complicated generic expression>(); 
+0

스칼라와 동일합니다. 이러한 언어는 다양한 인스턴스화 문에서 유형을 유추 할 수있는 구문을 제공합니다. 이는 var 키워드로 .NET에서 제공되는 것과 유사합니다. 이것을 가변적 인 유형으로 즉석에서 사용할 수있는 약한 (또는 느슨하게) 유형의 언어와 혼동하지 마십시오. JVM은 여전히 ​​컴파일 된 코드에서 강력한 타이핑을 강제합니다. –

4

일반적인 방법으로 제한된 형태의 유추를 사용하여 반복을 피할 수 있습니다.

예 : 기능

<K, V> Map<K, V> getSomething() { 
     //... 
    } 
이있는 경우 는

당신은 사용할 수 있습니다

final Map<String, Object> something = getsomething(); 

대신 :

:

final Map<String, Object> something = this.<String, Object>getsomething(); 
3

사용 Factory Pattern 제네릭의 창조를 위해 방법 샘플 : Shog9 언급

public Map<String, Integer> createGenMap(){ 
     return new HashMap<String,Integer>(); 

    } 
2

의사-형식 정의 안티 패턴이 작동 것 - 안티 패턴을 사용하지 않는 것이 좋습니다하지만 -하지만 그것은 당신의 의도를 다루지 않습니다. 의사 typedef의 목표는 선언의 혼란을 줄이고 가독성을 향상시키는 것입니다.

원하는 것은 하나의 거래로 제네릭 선언 그룹을 대체 할 수있는 것입니다. 나는 당신이 멈추고 생각해야한다고 생각합니다 : "마녀의 길은 가치가 있니?". 제 말은, 당신이 이것을 필요로 할 시나리오를 생각할 수 없다는 것입니다. A 클래스를 상상해보십시오 :

class A { 
    private Map<String, Integer> values = new HashMap<String, Integer>(); 
} 

'값'필드를지도로 변경하려고한다고 상상해보십시오. 동일한 변경이 필요한 코드를 통해 많은 다른 필드가 왜 흩어져 있습니까? '값'을 사용하는 연산에 대해서는 간단한 리팩토링만으로 충분할 것입니다.

관련 문제