我读过IBM中关于安全构造器技术的文章。本文的主要思想是,您不应该显式或隐式地在构造函数中公开此引用。但是关于兰巴达却没有提到。据我所知,lambda捕获本地上下文(仅为最终或有效的最终变量),所以如果您引用lambda体内的任何类方法,那么这个引用就公开了吗?
我的问题是:在构造函数中设计接受Runnable、Function、Predicate作为参数的类是一个很好的实践吗?如果您将简单的lambda (不引用类方法)传递给此类构造函数,那么我所理解的没有什么问题,但另一方面,它提供了将匿名内部类作为参数传递的方法,因此,这种引用可能会被公开。
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;
}
}发布于 2019-03-27 11:52:55
在构造函数中设计接受
Runnable、Function、Predicate作为参数的类是一个很好的实践吗?
是的,和其他任何物体一样。只要不公开this引用,就可以将任何想要的内容传递给构造函数。
在您的示例中,ClassA被破坏,而ClassB是线程安全的。通过在构造函数中创建内部匿名类并将其传递给另一个对象,可以隐式地让this引用从ClassA (父对象)中逸出。但是具有Function参数的类(Function)是安全构造的。
发布于 2019-03-27 11:33:21
设计接受Runnable的类是一种很好的实践吗?
如果您查看java.lang.Thread,您可以找到这样的构造函数
public Thread(Runnable target) {}答案是yes,甚至甲骨文也这么做。
https://stackoverflow.com/questions/55375347
复制相似问题