我目前有这种方法(基本上是真正的方法,我只是重命名了变量和对象)
private void myMethod(
final InputMessage inputMessage,
final String id) {
try {
final Map<String, String> result =
jdbcTemplate.query(
QUERY /* sql */,
ROW_EXTRACTOR /* ResultSetExtractor */,
id /* args */
);
if (result != null) {
inputMessage.setParam1(result.get("param1"));
inputMessage.setId(result.get("description")); // Insert description
return;
}
} catch (final Exception e) {
logger.error(...);
}
final String param1 = ...
inputMessage.setParam1(param1);
inputMessage.setId(id); // Insert the ID
}
我想为此采用一种更实用的方法。只是尝试一下。
我坚决主张不同的解决方案,但没有一个能够保持相同的逻辑。
您将如何做?有可能吗?
我在Java 8
上,但是如有必要,您可以抛出Java 11
类和方法。
没有必要“转换”整个方法,我对result
提取后的部分更感兴趣。但是,它与try - catch
块紧密耦合。
答案 0 :(得分:1)
我宁愿从方法中返回新的InputMessage
而不是将其作为参数传递。假设您具有2个参数的InputMessage
构造函数,它将看起来像:
return Optional.ofNullable(result)
.map(map -> new InputMessage(map.get("param1"), map.get("description")))
.orElse(new InputMessage("id", "param1"));
答案 1 :(得分:0)
那又怎么样:
private void myMethod(final InputMessage inputMessage, final String id) {
final Map<String, String> result = null;
try {
result = jdbcTemplate.query(
QUERY /* sql */,
ROW_EXTRACTOR /* ResultSetExtractor */,
id /* args */
);
} catch (final Exception e) {
logger.error(...);
}
if (result != null)
setParams(inputMessage, result.get("param1"), result.get("description"))
else
setParams(inputMessage, param1, id);
}
public void setParams(final InputMessage inputMessage, String param1, String param2) {
inputMessage.setParam1(param1);
inputMessage.setId(param2);
}
答案 2 :(得分:0)
查询数据库结果时,应使用Java中的Optional类,以避免NullPointerExceptions。 (https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html是一些其他文档)。
例如,以下代码:
final Map<String, String> result =
jdbcTemplate.query(
QUERY /* sql */,
ROW_EXTRACTOR /* ResultSetExtractor */,
id /* args */
);
不应该返回null而是返回Optional<Map<String,String>>
,那么您将能够以如下功能方式编写代码:
result.ifPresent(res -> {
inputMessage.setParam1(res.get("param1"));
inputMessage.setId(res.get("description")); // Insert description
});
这也将帮助您取出try-catch语句,这里不需要。
同样好的做法是将数据获取功能分离到DAO层,并在Service层中对获取的对象进行操作。请在以下位置找到与此有关的更多文档:https://www.baeldung.com/java-dao-pattern