java - 使用 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
更好吗?
解决方案
性能取决于构建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)
或者
或者
推荐阅读
- mysql - 使用 MySQL 选择前 2 个值
- mysql - 在同一表达式中重新排序 RegEx 捕获组
- sql - SQL 显示职位代码、职位描述和每个职位的员工人数
- python - 指定应在 YML 文件中创建 conda-build conda.pth 文件?
- mysql - 我无法对数据库进行查询
- html - 在引导容器 / div 中保持对内容的约束
- java - Spring Boot:如何使用自动装配测试使用 gson 对象的类
- list - 返回包含有效元素的列表
- c - 使用 MPI_Pack 和 Unpack 以及 MPI_send 和 Recieve 时收到的垃圾值
- google-sheets - 是否有任何选项可以查看表格中的选定值?