gpt4 book ai didi

java - 为什么可选的不用于实例变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:05:36 25 4
gpt4 key购买 nike

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

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

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

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

这是一个提到它的页面:

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

这是示例代码。

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 的返回类型之前,您不知道邮政编码可能为 null。如果您是代码的新手,您可能会错过此添加扩展类,从而导致空指针异常。

这是一个关于 Scala 的 Option 的问题。

When to use Option

为什么 Java 和 Scala 在可选的使用方式上存在差异?

最佳答案

并非所有 Java 开发人员都同意您描述的方法。请检查这个post由 Lombok 的创建者提供。

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

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

另一方面,Option 与 Scala 标准库紧密结合。据我所知,没有 Scala 的标准库 API 返回 null,而是返回 Option,并且不鼓励在你的 Scala 中使用 null代码。您甚至可以配置您的项目,使其在 nullused 时编译失败。 .

Option 也是 Serializable 并且它的正常使用方式是作为可以为空的值的类字段。

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

Match(option).of(
Case($Some($()), "defined"),
Case($None(), "empty")
);

关于java - 为什么可选的不用于实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56457245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com