使用 java 供应商接口创建条件对象

Gau*_*m M 2 java performance java-8

我有一个方法如下:

void updateObject(ObjOne obj, SomeClass data) {
    if(obj != null) {
        obj.doSomething(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

在updateObject多次调用,避免空检查在每一个地方,我想避免以下的:

// directly invoke doSomething conditionally.
if(obj != null) {
    SomeClass data = getData();
    obj.doSomething(data);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

上述方法使用Supplier更好吗?

Hol*_*ger 9

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

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

或者

或者

或者

  • @Eugene 听起来像是一个可以通过代码转换来解决的问题。`logger.method(/*string concatenation*/)` 被编译(JDK 9+)以*推送记录器、推送参数*、`invokedynamic`(字符串连接)、`invoke…method`。转换器只需使用一个使用 *logger* 和 *arguments* 的自定义引导方法的“invokedynamic”来替换这两个调用。自定义引导方法只需要获取原始方法的句柄并预先添加条件检查。 (3认同)