首页 > 解决方案 > 使用 java Supplier 接口创建条件对象

问题描述

我有一个方法如下:

void updateObject(ObjOne obj, SomeClass data) {
    if(obj != null) {
        obj.doSomething(data);
    }
}

updateObject多次调用并避免在每个地方进行空检查,我想避免以下情况:

// directly invoke doSomething conditionally.
if(obj != null) {
    SomeClass data = getData();
    obj.doSomething(data);
}

由于data仅在obj非空时使用,所以我想重构代码如下:

void updateObject(ObjOne obj, Supplier<SomeClass> data) {
    if(obj != null) {
        obj.doSomething(data.get());
    }
}

这将SomeClass仅在需要时创建一个对象,而是创建一个Supplier类型的对象。

上述方法使用Supplier更好吗?

标签: javaperformancejava-8

解决方案


性能取决于构建SomeClass实例的成本,换句话说,只创建一个实例而不创建实例时可以节省Supplier的成本SomeClass,以及不创建实例的可能性SomeClass。如果SomeClass在大多数情况下无论如何都会创建实例,那么您显然无法通过另外创建一个Supplier.

如果您在不知道费用和可能性的情况下设计 API,您可以提供两种方法并让调用者决定使用哪一种。这是一个既定的模式,例如

或者

或者

或者


推荐阅读