Аннотация Spring @ Spring с Java 8 - PullRequest
       33

Аннотация Spring @ Spring с Java 8

0 голосов
/ 12 декабря 2018

Я использовал аннотацию @Conditional и должен был обеспечить реализацию matches() интерфейса Condition.Поскольку Condition является FunctionalInterface, как я могу использовать лямбду Java 8 для обеспечения реализации в аннотации вместо предоставления реализации.

@Conditional(value = MyCondition.class)

class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return ifMatches;
    }
}

1 Ответ

0 голосов
/ 13 декабря 2018

Вы не можете.

Лямбды являются экземплярами классов, а @Conditional нужен сам класс.

Лямбда

Function<String, String> capitalize = text -> text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();

Функционально идентична

Function<String, String> capitalize = new Function<String, String>() {
    public String apply(String text) {
        return Function<String, String> capitalize = text -> text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();
    }
};

Оба являются экземплярами анонимных классов, а не самим анонимным классом.Нет никакого способа фактически получить доступ к анонимным классам (за пределами отражения, но вы не можете использовать отражение в аннотациях).

Передача лямбды, где ожидается класс, будет похожа на передачу строки, где ожидается класс,Т.е. что-то вроде этого:

public @interface MyAnnotation {
    Class<?> value();
}

@MyAnnotation("this is a string")
public class MyClass {
}

, что вы не ожидаете, что сработает.

...