#java #lambda
#java #лямбда
Вопрос:
Я пишу тестовый пример для заводского класса. Фабрика (скорее шаблон прототипа) возвращает типы сопоставителей в соответствии с заводскими параметрами. Возвращаемые сопоставления являются ссылками на статические методы.
В ходе теста я обнаружил, что не могу сравнить результирующие ссылки на методы, потому что не могу получить доступ к изначально созданному методу. Поскольку контекст ::
оператора решает, будет ли ссылка на метод воссоздана или использована повторно, я сохранил ссылки на методы static finals
. Теперь тест будет сравнивать результат со статикой:
assertEquals(MatcherFactory.MATCH_A, matcherFactory.createMatcher(conditionA))
Что я в основном делаю, так это сохраняю ссылки на классы-оболочки лямбд. Я считаю этот подход допустимым. Есть ли в этом что-то не так? Есть ли скрытая ловушка? Конечно, сопоставители потокобезопасны.
Пример кода:
public class MatcherFactory {
public static final MyMatcher MATCH_FALSE = MatcherFactory::matchFalse;
public static final MyMatcher MATCH_A = MatcherFactory::matchA;
public static final MyMatcher MATCH_B = MatcherFactory::matchB;
public static final MyMatcher MATCH_AB = MatcherFactory::matchAB;
public MyMatcher getMatcherFor(Condition condition) {
switch (condition) {
case A:
return MATCH_A;
case B:
return MATCH_B;
case AB:
return MATCH_AB;
}
return MATCH_FALSE;
}
public static boolean matchA(Object ... operators) {
// match magic
}
public static boolean matchB(Object ... operators) {
// match magic
}
public static boolean matchAB(Object ... operators) {
// match magic
}
public static boolean matchFalse(Object ... operators) {
return false;
}
}