Ran*_*ion 3 java optional-parameters guava
最近我和我的队友讨论了Guava Optional在方法中使用可选参数的问题.
我们说方法是
List<Book> getBooks(String catalogId, Optional<String> categoryId) {
Validate.notNull(catalogId);
Validate.notNull(categoryId); // Point of conflict. Is this required?
Run Code Online (Sandbox Code Playgroud)
它接受一个catalogId和一个可选项 categoryId,它返回该目录中列出的书籍,如果类别也被传递,则只返回该类别中的书籍.
冲突点是,验证Optional<String> categoryId空检查.我认为不应该对它进行空检查,因为它是一个可选参数.该函数的调用者可以传递null或Optional.<String>absent()与getBooks功能应做处理这两种情况if(categoryId==null && categoryId.isPresent())在执行.
我的意见是,Optional对于可选参数,只是使方法的合同更加清晰.通过查看方法签名,可以告诉该参数是可选的,并且不需要读取javadoc.但是Optional.absent()当他不想使用那个可选参数时,他不应该被迫通过.
我的队友有不同的看法.他想对它进行空检查,因此强制调用者总是通过Optional.<String>absent().他的观点是我们为什么要传递null可选.而且getBooks("catalog123", Optional.absent())看起来更可读getBooks("catalog123", null).
此方法位于我们的一个库包中,由我们拥有的多个包使用.
您Optional对此方案的使用有何建议?
谢谢
对于此方案,您对Optional的使用有何建议?
避免.避免.避免.
虽然Optional是一个很好的替代来null,在Java中,你会总是与它是一个结束了糟糕的除了代替.正如Seelenvirtuose所写,有三种可能性,你只需要两种.正如JB Nizet所写,它最好用作返回值,它会提醒调用者所需的检查.作为方法论证,它没有任何帮助.
理想情况下,可选参数只是可选的参数
getBooks(String catalogId, String categoryId = null)
Run Code Online (Sandbox Code Playgroud)
这不是有效的Java.AFAIK C++编译器将其转换为两种方法
getBooks(String catalogId, String categoryId)
getBooks(String catalogId)
Run Code Online (Sandbox Code Playgroud)
这是你自己用Java编写的.抛出参数是明确表明它是可选的最明确的方法.将可选参数标记@Nullable为几乎同样好.使用可空性检查工具可以帮助您避免NPE(这是主要参数Optional).
重要的是一致性.您的课程的一致性掌握在您手中.与JDK的一致性意味着null至少在可预见的将来使用(有一天JDK 8 Optional可能会占上风).
| 归档时间: |
|
| 查看次数: |
2144 次 |
| 最近记录: |