Как кратко определить привязки Guice параметризованных классов с помощью Xtend? - PullRequest
0 голосов
/ 20 ноября 2011

Следующий код Java устанавливает привязку Guice. Он использует анонимный подкласс AbstractModule, который обеспечивает реализацию configure для установки привязок, и анонимный подкласс TypeLiteral для создания привязки Map к HashMap для параметров конкретного типа ( как здесь описано ).

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, чтобы сделать это хорошо?

Ответы [ 3 ]

1 голос
/ 22 ноября 2011

Вы можете использовать замыкание для реализации интерфейса модуля:

инжектор = Guice.createInjector [ связывания (TypeOf (SomeType)). к (TypeOf (AnImplementation)) ]

Однако это не решит проблему для литералов типа. Для этого вам придется использовать Java, но я думаю, что это не повредит.

1 голос
/ 20 ноября 2011

как насчет создания реального класса вместо анонимного внутреннего?

0 голосов
/ 04 мая 2012

В связанной заметке вы можете использовать замыкание Xtend для реализации интерфейса провайдера Guice.

Например, вызов IResourceScopeCache.get в Java:

@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().

...