首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >例如,为什么不使用可选变量?

例如,为什么不使用可选变量?
EN

Stack Overflow用户
提问于 2019-06-05 08:56:02
回答 4查看 5.9K关注 0票数 10

我已经阅读了很多关于应该使用Optional的案例。

我读过的很多页面都说,Optional不应该用于私有实例变量,而应该由getter返回。

我认为将私有实例变量作为可选变量仍然是有用的。如果有人查看我的代码,他们可以看到值可以是空的,而不必检查文档以查看是否可以返回null。

在Scala中,null从未被使用过,而且只存在于与Java的互操作性中。如果值可以为null,则建议始终使用可选选项。这种方法对我来说更有意义。

这里有一页提到这一点:

https://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html

下面是示例代码。

代码语言:javascript
运行
复制
private final String addressLine;  // never null
private final String city;         // never null
private final String postcode;     // optional, thus may be null

// normal getters
public String getAddressLine() { return addressLine; }
public String getCity() { return city; }

// special getter for optional field
public Optional<String> getPostcode() {
  return Optional.ofNullable(postcode);
}

我能看到的唯一优点是,如果您想序列化对象,那么现在就有可能了,因为它不是在变量中存储可选的。

缺点是,在检查getter的返回类型之前,您不知道邮政编码可能为空。如果您是新代码,您可能会错过这个add扩展类,从而导致一个空指针异常。

这里有一个关于Scala的Option的问题。

何时使用选项

为什么Java和Scala在使用可选性方面有区别?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-05 10:08:24

并不是所有的Java开发人员都同意您描述的方法。请检查这个帖子由Lombok的创造者。

我猜想,在Java中使用Optional的不同方法的原因是,Java社区一直没有Java 8,所以大多数人习惯于使用null。一方面,许多新API(如findAny from Stream)返回Optional,但仍然有许多标准库方法只返回,因此您必须始终记住,要么用Optional.ofNullable包装函数调用,要么检查值是否为null。

Optional被添加到Java8中,但不鼓励将其作为类字段使用,因为Optional没有实现Serializable (许多框架或系统(如Akka、Spark、Kafka等)都使用Java的序列化作为默认序列化引擎)。

另一方面,Option与Scala标准库绑定得非常紧密。据我所知,Scala的标准库API不返回,但返回Option,因此在Scala代码中使用是不可取的。您甚至可以配置您的项目,如果null使用,它将无法编译。

Option也是Serializable,它的通常做法是作为可以为空的值的类字段使用。

如果您想在选项代码中使用类似的方法,请从Vavr中检查。它是可序列化的,因此可以安全地作为字段使用,它还有两个子类NoneSome (类似于Scala的Option),因此它可以用于Vavr的模式匹配:

代码语言:javascript
运行
复制
Match(option).of(
    Case($Some($()), "defined"),
    Case($None(), "empty")
);
票数 13
EN

Stack Overflow用户

发布于 2019-06-05 09:15:39

在Scala中,选项紧密集成到语言的API中。

表示可选值。选项的实例要么是scala.Some的实例,要么是对象None。使用scala.Option实例的最惯用的方法是将其视为集合或monad,并使用map、flatMap、filter或foreach。

正如您可以从上面的引号中看到的,这里没有null解释,因为它应该被用作单曲或集合。

在Java中,可选用于将我们从NullPointerException案例中拯救出来,方法是:

可能包含或不包含非空值的容器对象。如果存在一个值,isPresent()将返回true,get()将返回该值。

通过使用Kotlin,一种非常清楚地向用户显示变量是否为空的编程语言是?安全呼叫,并显示了编译错误:

代码语言:javascript
运行
复制
var a: String = "abc"
a = null // compilation error

var b: String? = "abc"
b = null // ok
print(b)
票数 6
EN

Stack Overflow用户

发布于 2019-06-05 10:41:45

有一个位置,即像Stream一样,可选类是一个迭代事件类,不值得作为“真实”对象中的字段使用。

然后是短期的,不是可序列化的(这可能是工作)。

然而,我的观点是,有些变量可能是可选的,基数为0和1。就像列表也是有效的一样。对于List字段,趋势是(IMHO)最初不让它为null,而是始终拥有一个(空)列表。

在相同的编码样式中,Optional确保只使用安全访问,特别是可以以链接方式映射:

代码语言:javascript
运行
复制
Optional<TextField> t = ...

String s = t.map(t::getText).orElse("N/A");
Optional<String> u = t.map(t::getText);
t.ifPresent(s -> { ... });

特别是ifPresent确保了不使用空值。

可选是一个很有价值的规范。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56457245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档