我正在使用Vertx实现一个方法来检查数据库中是否存在某个值,并将Handler与AsyncResult一起使用。
我想知道哪一个是最佳做法:
选项1:当找不到任何内容时,Handler处于succeededFuture但结果为FALSE:
public void checkExistence (..., String itemToFind, Handler<AsyncResult<Boolean>> resultHandler) {
// ....
doQuery(..., queryHandler -> {
if (queryHandler.succeeded()) {
List<JsonObject> results = queryHandler.result();
boolean foundIt = false;
for (JsonObject json: results) {
if (json.getString("someKey").equals(itemToFind)) {
foundIt = true;
break;
}
}
resultHandler.handle(Future.succeededFuture(foundIt));
} else {
resultHandler.handle(Future.failedFuture(queryHandler.cause().toString()));
}
});
}
选项2:当找不到任何内容时,处理程序处于failedFuture:
public void checkExistence (..., String itemToFind, Handler<AsyncResult<Void>> resultHandler) {
// ....
doQuery(..., queryHandler -> {
if (queryHandler.succeeded()) {
List<JsonObject> results = queryHandler.result();
boolean foundIt = false;
for (JsonObject json: results) {
if (json.getString("someKey").equals(itemToFind)) {
foundIt = true;
break;
}
}
// HERE IS THE DIFFERENCE!!!
if (foundIt) {
resultHandler.handle(Future.succeededFuture());
} else {
resultHandler.handle(Future.failedFuture("Item " + itemToFind + " not found!"));
}
} else {
resultHandler.handle(Future.failedFuture(queryHandler.cause().toString()));
}
});
}
更新:
假设我有另一个例子,而不是检查存在,我想得到所有结果。我检查清空结果吗?我是否将清空视为失败或成功?
选项1:仅在非空或空时输出,否则输出
public void getItems(..., String itemType, Handler<AsyncResult<List<Item>>> resultHandler) {
// ....
doQuery(..., queryHandler -> {
if (queryHandler.succeeded()) {
List<Item> items = queryHandler.result();
if (items != null && !items.empty()) {
resultHandler.handle(Future.succeededFuture(items));
} else {
resultHandler.handle(Future.failedFuture("No items found!"));
}
} else {
resultHandler.handle(Future.failedFuture(queryHandler.cause().toString()));
}
});
}
选项2:我得到的输出结果,即使它可能为空或null
public void getItems(..., String itemType, Handler<AsyncResult<List<Item>>> resultHandler) {
// ....
doQuery(..., queryHandler -> {
if (queryHandler.succeeded()) {
List<Item> items = queryHandler.result();
resultHandler.handle(Future.succeededFuture(items));
} else {
resultHandler.handle(Future.failedFuture(queryHandler.cause().toString()));
}
});
}
答案 0 :(得分:2)
第一个选项更好,因为您可以清楚地说,checkExistence
返回True
或False
并成功完成,或者失败并出现一些异常(数据库问题等)
但是,让我们说,你决定坚持使用第二种选择。然后,假设你有另一种方法:
void getEntity(int id, Handler<AsyncResult<Entity>> resultHandler);
如果提供entity
的{{1}}不存在,您会抛出异常(使用id
)还是返回Future.failedFuture
(使用null
)?我认为,你应该抛出异常使你的方法逻辑彼此相似。但是,那是一种特殊的情况吗?
对于返回实体列表的情况,如果没有实体,则可以返回空列表。单个实体也是如此:最好返回Future.succeededFuture
而不是Optional<Entity>
,因为这样可以避免Entity
并且代码中没有可空变量。什么更好:NullPointerException
或空Optional<List<Entity>>
,这是一个悬而未决的问题。
答案 1 :(得分:1)
特别是如果您将此作为可重复使用的代码编写,那么请务必使用您的第一个选项。这种方法只是确定一个项目是否存在,因此应该简单地返回它是否存在。这种特殊的方法如何知道该项目是否存在的错误条件是什么?
某些来电者可能会确定这确实是一个错误;这就是情况,如果Future以 false 返回,它将抛出适当的异常。但是另一个呼叫者可能只需要在继续之前知道该项是否存在;在这种情况下,您会发现自己使用异常处理来构建业务逻辑。