java - 返回 Optional<Map<String, String>> 而不仅仅是一个空的 Map<String, String> 的真正好处是什么

标签 java java-8 option-type

<分区>

如果我的代码返回 Map<String, String>当然可以,但可能是空的。将其转换为返回有好处吗 Optional<Map<String, String>> .它会给空但不是 null 的实例带来任何好处吗?

最佳答案

就像计算机编程中的许多主题一样,这取决于 (tm)。

我使用 optional 的方式是作为 null 的替代(简而言之)。其中之一advantages是它迫使调用者考虑可能没有返回值,并且这是一个有效条件......考虑上面链接的答案中的引号:

absence of a value is a more precise formulation than null

Any reader of your code or consumer of your API will be beaten over the head with the fact that there might be nothing there and that a check is necessary before accessing the value.

所以当我看到返回类型签名时 Optional<Map<String, String>> ,我认为它是一个函数的返回类型,其中一个空 Map可能是有效的返回值,但完全缺少 Map 也是如此.

这方面的例子包括 getCachedFavoriteColors , findInvalidValuePairs等。在前一种情况下,可能没有任何用户,这将返回一个空的 Map。 -- 但可能没有缓存值,这将返回无效的 Optional .在第二种情况下,可能没有任何无效值对,这将再次返回一个空的 Map。 , 但也可能没有 Invalidator .你明白了。

请注意,在上述某些情况下,您可能希望抛出异常而不是返回无效的 Optional。 .这是您作为 API 设计者的决定。

关于java - 返回 Optional<Map<String, String>> 而不仅仅是一个空的 Map<String, String> 的真正好处是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29711884/

相关文章:

Java 8 - 获取列表元素的 'parent' 对象

java - 与私有(private)方法冲突时在接口(interface)中调用默认方法

Swift 字符串 vs. 字符串!与字符串?

c++ - 使用 std::Optional 函数模板参数推导失败

java - Spring mvc Time 列接收 null 导致 HttpMessageNotReadableException

java - Thymeleaf 隐藏输入值始终为 null

java - SWIG 生成的代码不处理或抛出异常

java - 匿名类可以访问 Java 8 中的非最终外部对象吗?

java - 如何在托管的 spring 事务中运行遗留代码?

swift - 为什么 '+=' 不适用于隐式展开的可选值?