我已经阅读了很多关于应该使用Optional的案例。
我读过的很多页面都说,Optional不应该用于私有实例变量,而应该由getter返回。
我认为将私有实例变量作为可选变量仍然是有用的。如果有人查看我的代码,他们可以看到值可以是空的,而不必检查文档以查看是否可以返回null。
在Scala中,null从未被使用过,而且只存在于与Java的互操作性中。如果值可以为null,则建议始终使用可选选项。这种方法对我来说更有意义。
这里有一页提到这一点:
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的返回类型之前,您不知道邮政编码可能为空。如果您是新代码,您可能会错过这个add扩展类,从而导致一个空指针异常。
这里有一个关于Scala的Option的问题。
为什么Java和Scala在使用可选性方面有区别?
发布于 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中检查。它是可序列化的,因此可以安全地作为字段使用,它还有两个子类None和Some (类似于Scala的Option),因此它可以用于Vavr的模式匹配:
Match(option).of(
Case($Some($()), "defined"),
Case($None(), "empty")
);发布于 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,一种非常清楚地向用户显示变量是否为空的编程语言是?安全呼叫,并显示了编译错误:
var a: String = "abc"
a = null // compilation error
var b: String? = "abc"
b = null // ok
print(b)发布于 2019-06-05 10:41:45
有一个位置,即像Stream一样,可选类是一个迭代事件类,不值得作为“真实”对象中的字段使用。
然后是短期的,不是可序列化的(这可能是工作)。
然而,我的观点是,有些变量可能是可选的,基数为0和1。就像列表也是有效的一样。对于List字段,趋势是(IMHO)最初不让它为null,而是始终拥有一个(空)列表。
在相同的编码样式中,Optional确保只使用安全访问,特别是可以以链接方式映射:
Optional<TextField> t = ...
String s = t.map(t::getText).orElse("N/A");
Optional<String> u = t.map(t::getText);
t.ifPresent(s -> { ... });特别是ifPresent确保了不使用空值。
可选是一个很有价值的规范。
https://stackoverflow.com/questions/56457245
复制相似问题