Я прочитал статью IBM о методах безопасного конструктора в Java.Основная идея статьи в том, что вы не должны явно или неявно выставлять эту ссылку в конструкторе.Но ничего не сказано о лямбдах.Насколько я знаю, лямбды захватывают локальный контекст (только конечные или фактически конечные переменные), поэтому, если вы ссылаетесь на какой-либо метод класса внутри лямбда-тела, тогда эта ссылка доступна?
У меня следующий вопрос: это хорошая практика для разработки классов, которые принимают Runnable
, Function
, Predicate
в качестве аргумента в конструкторе?Если вы передаете простую лямбду (не ссылается на методы класса) такому конструктору, то, как я понимаю, в этом нет ничего плохого, но с другой стороны, он обеспечивает способ передачи анонимного внутреннего класса в качестве аргумента в результате this ссылка может быть раскрыта.
public class ClassA {
private ClassB classB;
public ClassA() {
// fine
classB = new ClassB(integer -> integer % 2 == 0);
// oops
classB = new ClassB(new Function<Integer, Boolean>() {
@Override
public Boolean apply(Integer integer) {
return integer % 2 == 0;
}
});
}
}
public class ClassB {
private final Function<Integer, Boolean> function;
public ClassB(Function<Integer, Boolean> function) {
this.function = function;
}
}