我有一个方法如下:
void updateObject(ObjOne obj, SomeClass data) {
if(obj != null) {
obj.doSomething(data);
}
}
updateObject
被调用了很多次,为了避免在每个地方都进行 null 检查,我想避免以下情况:
// directly invoke doSomething conditionally.
if(obj != null) {
SomeClass data = getData();
obj.doSomething(data);
}
由于data
仅在obj
为非null时使用,我想到重构代码如下:
void updateObject(ObjOne obj, Supplier<SomeClass> data) {
if(obj != null) {
obj.doSomething(data.get());
}
}
这只会在需要时创建一个 SomeClass
对象,而不是创建一个 Supplier
类型的对象。
上述使用 Supplier
的方法是否更好?
最佳答案
性能取决于 SomeClass
的构建成本例如,换句话说,仅创建 Supplier
时可以节省什么永远不会 SomeClass
实例,以及不创建 SomeClass
的可能性实例。如果SomeClass
在大多数情况下无论如何都会创建一个实例,显然你不能通过另外创建一个 Supplier
来保存任何东西。 .
如果您在不知道费用和可能性的情况下设计 API,您可以提供这两种方法并让调用者决定使用哪一种。这是一个既定的模式,例如
Objects.requireNonNull(T obj, String message)
对比Objects.requireNonNull(T obj, Supplier<String> messageSupplier)
或
Objects.requireNonNullElse(T obj, T defaultObj)
对比Objects.requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
或
Optional.orElse(T other)
对比Optional.orElseGet(Supplier<? extends T> supplier)
或
log(System.Logger.Level level, String msg)
对比log(System.Logger.Level level, Supplier<String> msgSupplier)
https://stackoverflow.com/questions/67006971/