2011-11-20 2 views
0

다음 Java 코드는 Guice 바인딩을 설정합니다. 바인딩을 설정하는 configure의 구현을 제공하는 익명 하위 클래스 과 익명 하위 클래스 TypeLiteral을 사용하여 특정 유형 매개 변수 (as described here)에 대해 Map에서 HashMap의 바인딩을 만듭니다.Xtend를 사용하여 매개 변수화 된 클래스의 Guice 바인딩을 간결하게 정의하는 방법은 무엇입니까?

injector = Guice.createInjector(new AbstractModule() { 
    @Override protected void configure() { 
     bind(new TypeLiteral<Map<String, Event>>() {}) 
      .to(new TypeLiteral<HashMap<String, Event>>() {}); 
    } 
}); 
는 는

어떻게 Xtend이 쓸 수 ?

Xtend는 익명 클래스 또는 중첩 클래스 (문서에는 언급되지 않았지만 작동하는 구문을 추측 할 수 없음) 구현을 지원하지 않습니다. 그래서 내 AbstractModule과 각각의 TypeLiteral 구현을 별도의 Xtend 파일에 정의해야합니다 ...별로 간결하지 않습니다. 이 일을 잘하기 위해 Xtend 또는 Guice 트릭이 누락 되었습니까?

답변

1

:

인젝터 = Guice.createInjector [ 바인드 (대해서 typeof (SomeType)) (대해서 typeof (AnImplementation)) 합니다.]

그러나,이 타입 리터럴의 문제는 해결되지 않습니다. 당신은 자바를 사용해야 만 하겠지만, 다 치지는 않을 것이라고 생각합니다.

1

익명의 내부 클래스 대신 실제 클래스를 intoducing하는 것은 어떻습니까?

당신은 모듈 인터페이스를 구현하는 클로저를 사용할 수
+0

안녕하세요 크리스천 - 좋은 생각이고 내 접근 방식입니다. 그러나 실제 클래스는 Java에 머물러 있어야합니다. 그렇지 않으면 모든 TypeLiteral 구현에 대한 실제 클래스도 선언해야합니다. 실제로는 위 코드에 표시된 코드가 2 개 이상 있습니다. Xtend 솔루션, 또는 문제를 해결할 수있는 다른 Guice API가 있는지 여부에 관심이 있습니다. – rewbs

+1

xtend 홈페이지를 인용 해 보겠습니다. * Xtend는 Java를 모두 함께 대체하는 것이 아니라 Java가 빛나지 않는 상황에서 편리한 대체 방법입니다. * guice 모듈은 xtend에서 끝내지 않을 것입니다. –

0

관련 메모에서 Xtend 클로저를 사용하여 Guice의 Provider 인터페이스를 구현할 수 있습니다. 자바 IResourceScopeCache.get 호출 예

:

Xtend에
@Inject 
private IResourceScopeCache cache; 

public EvaluatedResource getEvaluatedResource(EObject object) { 
    final Resource resource = object.eResource(); 
    return cache.get("key", resource, new Provider<Object>() { 
     public Object get() { 
      return evaluate(resource); 
     } 
    }); 
} 

public EvaluatedResource evaluate(Resource resource) { 
    ...; // create EvaluatedResource evaluatedResource 
    return evaluatedResource; // return it 
} 

가된다 :

@Inject 
IResourceScopeCache cache 

def getEvaluatedResource(EObject object) { 
    val resource = object.eResource 
    cache.get("key", resource, [|evaluate(resource)]) 
} 

def evaluate(Resource resource) { 
    ... // create EvaluatedResource evaluatedResource 
    evaluatedResource // return it 
} 

트릭이 [|...]이 경우 Provider.get()에서 제로 파라미터와 함수 있다는 .