Java 8可选–基于值的类使用教程

时间:2020-02-23 14:36:19  来源:igfitidea点击:

在本文中,我们将使用Java 8 Optional类,并了解什么是基于值的类。
使用基于值的类的方案是什么?最后,请参阅"可选"的使用教程。

Java 8可选

可选的是包含或者不包含非null值的容器对象。
您可以在此处阅读有关可选的更多信息。
Java 9中的Optional类进行了一些改进,请在此处阅读。

为什么要使用可选类?

  • 促进更好,更清洁的设计和代码

  • 它声明了变量的目的和意图。

  • 减少测试工作

  • 避免NullPointerException

  • 它支持快速失败编程方法

  • 取消锅炉板的条件检查。

  • 支持流利的风格

  • 促进使用函数式编程。

可选的是基于值的类。
我们将在本文后面介绍基于值的类。

值类型

在深入研究基于值的类之前,让我们了解什么是值类型?值类型是一种数据类型,旨在按值传入和传出方法,并按值存储在数据结构中。
Java语言直接支持的唯一值类型是八种原始类型。

Brian Goetz在"价值的状态"一文中提出,可以使用一种新的类型(一种值类型)来温和扩展Java VM和语言,该类型可以有效地结合Java当前类和基本类型的属性,并且这些属性应该很小不变且无身份。

值类型应与"像类一样的代码,像int一样工作"的同义词。

基于价值的类

值类型的概念构成了基于值的类的基础。
每个值类型的框式形式都是基于值的类。

基于值的类是Container类,是基于值的类型的包装器,其中基于值的类的实例遵循以下原则(来自Java文档):

  • 是最终且不可变的(尽管可能包含对可变对象的引用)

  • 具有equals,hashCode和toString的实现,这些实现仅根据实例的状态而不是根据其标识或者任何其他对象或者变量的状态来计算

  • 不使用身份敏感的操作,例如实例之间的引用相等(==),实例的身份哈希码或者实例的固有锁定上的同步

  • 仅基于equals()而不是基于引用相等(==)被视为相等

  • 没有可访问的构造函数,而是通过工厂方法实例化的,这些方法不承诺返回实例的身份

  • 在相等时可以自由替换,这意味着在任何计算或者方法调用中互换等于equals()的任意两个实例x和y都不会在行为上产生明显的变化。
    如果程序试图区分两个引用,则可能会产生不可预测的结果等于基于值的类的相等值,无论是直接通过引用相等,还是间接通过调用同步,身份哈希,序列化或者任何其他身份敏感机制来实现。
    在基于值的类的实例上使用此类标识敏感的操作可能会产生不可预料的影响,应避免。
    仅将基于值的类的实例放置为最终的,不可变的,并且由于这些实例没有适当的状态和标识, Java Optional类使用教程Java Optional Java逐步走向一种编程的功能样式,基于值的类有助于促进不变性,这是编程的编程风格的一个组成部分。
    仅仅被认为是在NullPointerException的替代上下文中使用的,并且自从引入以来,在很多情况下都建议这样做,但是当我们通过基于值的类的视角来查看它时,我们就会得到使用的限制和目的可选:不应将可选用于相等性检查或者基于身份的操作。
    不应执行以下操作:

  • 它不应在HashMap中用作键。
    不允许以下行为:

  • 可选,不应在Serializable类中用作非瞬态变量。
    应避免以下情况:

  • 不应用作Entity,Data或者Model类的元素。
    这些类用于持久性,因此需要标识和序列化。
    因此,我们不应该使用Optional实例变量。

  • Java Optional类不应用于同步。
    应避免以下代码:

  • 当需要明确表示"无结果"并且使用"空"可能会导致错误时,"可选"主要用于方法返回类型。
    类型为"可选"的变量本身不应为null;它应始终指向Optional实例。