对于许多开发人员来说,Java8中引入的Optional类型是一个新事物.

用getter方法返回Optional<Foo>类型而不是classic 的Foo类型是一种好的实践吗?假设该值可以是null.

推荐答案

当然,人们会为所欲为.但我们在添加这个功能时确实有一个明确的意图,它是not,是一个通用的可能类型,因为很多人都希望我们这样做.我们的目的是为库方法返回类型提供一种有限的机制,其中需要有一种清晰的方式来表示"无结果",而使用null来表示"无结果"极有可能导致错误.

例如,您可能永远不应该将其用于返回结果数组或结果列表的内容,而应返回空数组或列表.您几乎不应该将其用作某物的字段或方法参数.

我认为常规地将其用作getter的返回值肯定会过度使用.

没有什么是wrong可选的应该避免的,只是它不是许多人希望的那样,因此我们相当担心狂热过度使用的风险.

(公共服务公告:NEVER呼叫Optional.get,除非你能证明它永远不会为空;相反,使用orElseifPresent这样的安全方法之一.回顾过go ,我们应该呼叫get,比如getOrElseThrowNoSuchElementException,或者更清楚地表明,这是一种高度危险的方法,从一开始就 destruct 了Optional的整体用途.第1课赚得.(更新:Java10有Optional.orElseThrow(),这在语义上等同于get(),但其名称更合适.)

Java相关问答推荐

如何让TaskView总是添加特定的列来进行排序?

更新我们的一个文物后出现了严重的符号引用错误

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

我的scala文件失败了Scala.g4 ANTLR语法

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

当涉及到泛型时,类型推理在Java中是如何工作的?

无法使用Java&;TestContainers获取AWS SQS队列的属性

将响应转换为带值的键

try 判断可选参数是否为空时出现空类型安全警告

如何从日志(log)行中删除包名称?

没有使用Lombok生成的参数

JNI:将代码打包成自包含的二进制文件

从泛型枚举创建EnumMap

循环不起作用只有第一个元素重复

如何使用WebEnvironment.RANDOM_PORT获得第二个随机端口?

如何在Maven Central上部署?

无法使用Open WebStart Java 8运行jnlp

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

javax.crypto-密码对象-提供者服务是如何工作的?