0

次の Java コードは、Guice バインディングをセットアップします。AbstractModuleの実装を提供するの匿名サブクラスを使用しconfigureてバインディングを設定し、 の匿名サブクラスを使用して特定の型パラメーターのへTypeLiteralのバインディングを作成します (ここで説明されているように)。MapHashMap

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 のトリックが欠けていますか?

4

3 に答える 3

1

匿名の内部クラスの代わりに実際のクラスを導入するのはどうですか?

于 2011-11-20T11:05:50.590 に答える
1

クロージャを使用してモジュール インターフェイスを実装できます。

インジェクター = Guice.createInjector [ bind(typeof(SomeType)).to(typeof(AnImplementation)) ]

ただし、これは型リテラルの問題を解決しません。そのためにはJavaを使用する必要がありますが、問題はないと思います。

于 2011-11-21T20:09:28.080 に答える
0

関連して、Xtend クロージャーを使用して Guice の Provider インターフェースを実装できます。

たとえば、Java で IResourceScopeCache.get を呼び出します。

@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
}

Xtend では次のようになります。

@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()です。

于 2012-05-04T13:07:07.723 に答える