首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的安全构造技术

Java中的安全构造技术
EN

Stack Overflow用户
提问于 2019-03-27 10:47:20
回答 2查看 95关注 0票数 1

我读过IBM中关于安全构造器技术的文章。本文的主要思想是,您不应该显式或隐式地在构造函数中公开此引用。但是关于兰巴达却没有提到。据我所知,lambda捕获本地上下文(仅为最终或有效的最终变量),所以如果您引用lambda体内的任何类方法,那么这个引用就公开了吗?

我的问题是:在构造函数中设计接受RunnableFunctionPredicate作为参数的类是一个很好的实践吗?如果您将简单的lambda (不引用类方法)传递给此类构造函数,那么我所理解的没有什么问题,但另一方面,它提供了将匿名内部类作为参数传递的方法,因此,这种引用可能会被公开。

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-27 11:52:55

在构造函数中设计接受RunnableFunctionPredicate作为参数的类是一个很好的实践吗?

是的,和其他任何物体一样。只要不公开this引用,就可以将任何想要的内容传递给构造函数。

在您的示例中,ClassA被破坏,而ClassB是线程安全的。通过在构造函数中创建内部匿名类并将其传递给另一个对象,可以隐式地让this引用从ClassA (父对象)中逸出。但是具有Function参数的类(Function)是安全构造的。

票数 1
EN

Stack Overflow用户

发布于 2019-03-27 11:33:21

设计接受Runnable的类是一种很好的实践吗?

如果您查看java.lang.Thread,您可以找到这样的构造函数

代码语言:javascript
复制
public Thread(Runnable target) {}

答案是yes,甚至甲骨文也这么做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55375347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档