gpt4 book ai didi

java - 使用 Optional.orElseGet 做一些日志记录逻辑是个好主意吗

转载 作者:行者123 更新时间:2023-11-30 07:42:39 25 4
gpt4 key购买 nike

我想使用 Optional 来处理空值,我想不出什么是最好的方法的“棘手”部分是我想在值为空时进行日志记录。我可以通过以下代码实现这一点 - 但感觉很尴尬。

(更新:我已经发布了我自己的答案,来自 Java 9 的 Optional)

假设代码如下所示:

// logLine.getSomeProperty returns Optional<String>

List<LogDetails> logDetails = logLine.getSomeProperty()
.map(this::extractLogDetails)
.orElseGet(() -> logError(logLine));
List<LogDetails> extractLogDetails(String s) {
List<LogDetails> logDetails = new ArrayList<>();
String sp = "(?:([A-Z0-9]{5,7})-([A-Z0-9]{9})-(.{4}))";
Pattern p = Pattern.compile(sp, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(s);
while (m.find()) {
logDetails.add(new LogDetails(m.group(1), m.group(2), m.group(3)));
}
return logDetails;
}
List<LogDetails> logError(LogLine logLine) {
log.error("Error while ... {} ", logLine));
persistence.setErrorStatus(logLine, FAILED_PARSING);
return new ArrayList<>();
}

它会做我想做的事,但我有几个“问题”。

  • 我觉得很奇怪,那个名为 orElseGet 的方法用于日志记录错误。
  • 我可以用 orElseThrow 和 logError 替换 orElseGet 并且不抛出任何东西——我也不喜欢。
  • logError 方法返回我不使用的 List,从方法返回一些应该为 void 的东西看起来很奇怪。
  • 必须有更好的方法
  • someProperty 不为空但没有匹配项的情况 - 我也想记录,但为此我需要另一行代码来检查 logDetails.size() == 0

最佳答案

orElseGet 并不是真正的错误处理机制,而是一种在 Optional 实例不携带任何值的情况下生成不同默认值的方法。

如果您想检查 Optional 是否为空,只需使用 Optional.isPresent() 检查,然后执行 logError() 在这种情况下。

你首先要考虑的是,如果Optional为空,你想做什么?除了记录错误之外,您还想继续使用空列表吗?

如果是,那么你可以有这样的东西:

List<LogDetails> logDetails = logLine.getSomeProperty()
.map(this::extractLogDetails)
.orElseGet(Collections::emptyList);

之后你可以做:

if (logDetails.isEmpty()) {
logError(logline);
}

或者,如果您根本不想有一个空列表,您可以将内容保持在可选级别。这样,getSomeProperty() 为空或生成的列表为空的两种情况都以相同的方式处理。

Optional<List<LogDetails>> logDetailsOpt = logLine.getSomeProperty() 
.map(this::extractLogDetails)
.filter(list -> !list.isEmpty());

if (!logDetailsOpt.isPresent()) {
logError(logLine);
}

在这两种情况下,logError() 都不应返回任何内容。它正在以其名称做它打算做的事情,记录错误。

与其尝试过度使用 Optional 的功能,不如尝试在代码中明确说明您的意图。可读性更有值(value)。

关于java - 使用 Optional.orElseGet 做一些日志记录逻辑是个好主意吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54272680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com