如果您知道参数是可能需要或可能不需要的东西,是否有任何理由不使用Optional作为方法参数?


11

使用Java 8,我看到了越来越多有关Option / Optional用法的文章。我了解他们试图代表的意思,并且看到许多将它们用作回报的示例。但是我看不到它们在没有默认/可选参数语法的语言中被用作方法/函数参数。

Optional如果您知道该参数是可能需要或不需要的东西,是否有任何理由不用作方法参数?这是我想到的一个示例:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

这在Haskell中是它们的常用用法,它也没有默认参数(令人痛苦)。
Daniel Gratzer 2014年

见我的回答一个相关的堆栈溢出问题。简要地说,Optional它主要用于可能不存在的返回值。当然,其他用途也是可能的,但它们繁琐且风格可能很差。
斯图尔特·马克

Answers:


6

原因之一是,在概念上,firstNamemiddleName,和lastName在逻辑上是一个参数,而不是三个。它们都是更大整体的一部分,并且可以想象它们几乎总是在一起。在功能语言中,它们很可能以元组或记录的形式传递。Java缺少这些,因此它们很可能会聚合到Name类中。请注意,如果您需要组合使用全名并返回全名的函数,那么就不能不对其进行汇总-毕竟只能返回一个值。

也许只是很少出现一个值是可选的,也不是更大的整体的一部分。如果函数需要一定的值来执行其工作,则该函数不应接受Optional。如果您需要链接可能不会返回值的操作,并且Nothing在此过程中有任何功能失败时中止操作,则可以链接对的调用flatMap,如果您希望因异常而失败,则可以get()在该方法的任何步骤或链的末端。

如果一个值确实是可选的,并且一个函数根据其存在或不存在执行两种不同的操作,则这是一种代码味道,除非该函数是两个较小的函数的包装,每个函数均执行一项操作,并且决策的特定组合非常普遍。

我认为这不是一个错误,因为它是一个相对罕见的用例。


5

没有太多的语言不支持默认参数,因此这不是常见用法。我个人认为您的用法并不可怕,但是不会成为惯用的Java。Java非常有意地没有默认参数,而是强制使用重载,这具有编译器检查您的参数而不是if在函数内要求语句的优点。

换句话说,您将要制作两个不同版本的查询:一个带有中间名,另一个不带中间名。如果可以简洁的方式进行操作,则使用选项是个好主意。如果它很冗长,无论如何您都希望在两个单独的函数中使用它,则最好使用重载并将其惯用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.