当前位置: 代码网 > it编程>编程语言>Java > Java中Optional.of()方法及源码解析(非常详细!)

Java中Optional.of()方法及源码解析(非常详细!)

2024年06月17日 Java 我要评论
前言在java中,optional.of()方法是optional类中用于创建包含非空值的optional对象的静态方法。在本文中,我们将深入解析optional.of()的语法、使用场景,并通过多个

前言

在java中,optional.of() 方法是 optional 类中用于创建包含非空值的 optional 对象的静态方法。在本文中,我们将深入解析 optional.of() 的语法、使用场景,并通过多个示例详细说明。

方法解析

1. optional.of() 方法的语法

public static <t> optional<t> of(t value)
  • 参数: 非空的值 value
  • 返回值: 包含指定值的 optional 对象。

2. 使用示例

2.1 创建包含字符串的 optional 对象

optional<string> optional = optional.of("hello, world!");

上述代码创建了一个包含字符串 “hello, world!” 的 optional 对象。由于传入的值是非空的,因此不会引发 nullpointerexception

2.2 创建包含自定义对象的 optional 对象

class person {
    private string name;

    public person(string name) {
        this.name = name;
    }

    public string getname() {
        return name;
    }
}

person person = new person("john doe");
optional<person> optionalperson = optional.of(person);

这个示例中,我们定义了一个 person 类,并使用 optional.of() 创建了一个包含 person 对象的 optional 对象。

2.3 注意事项

optional<string> optional = optional.of(null); // 会抛出 nullpointerexception

optional.of() 要求传入的值不能为 null,否则会抛出 nullpointerexception。在上述示例中,传入了 null 值,导致抛出异常。

3. 使用场景

optional.of() 适用于确定值不为空的情况,提供了一种安全的方式来包装非空值,避免了空指针异常。但需要注意确保传入的值非空,否则会引发异常。

源码解析

1. optional.of() 方法的源码

public static <t> optional<t> of(t value) {
    return new optional<>(objects.requirenonnull(value));
}

上述源码显示了 optional.of() 方法的实现。以下是对源码的解析:

  • public static <t> optional<t> of(t value) {: 这是一个静态方法声明,返回类型是 optional<t>,其中 <t> 是泛型参数,表示 optional 包含的值的类型。参数 value 是需要包装的非空值。

  • return new optional<>(objects.requirenonnull(value));: 在方法体内,首先使用 objects.requirenonnull(value) 确保传入的值不为 null。如果传入的值为 nullobjects.requirenonnull 方法会抛出 nullpointerexception

    然后,通过 new optional<>(...) 创建一个新的 optional 对象,将传入的非空值包装在其中。

2. 源码解析总结

  • optional.of() 方法通过 objects.requirenonnull 确保传入的值非空,否则抛出 nullpointerexception
  • 创建了一个新的 optional 对象,并将传入的非空值包装在其中。

3. 注意事项

在使用 optional.of() 时,一定要确保传入的值不为 null,否则会导致异常。如果不能确定值是否为 null,建议使用 optional.ofnullable() 方法。

4. optional 类的基本结构

在深入解析 optional.of() 的源码之前,我们先了解一下 optional 类的基本结构。optional 类的核心思想是包装可能为 null 的值,提供了一些方法来处理这种情况。

public final class optional<t> {

    private static final optional<?> empty = new optional<>();

    private final t value;

    private optional() {
        this.value = null;
    }

    private optional(t value) {
        this.value = objects.requirenonnull(value);
    }

    public static <t> optional<t> of(t value) {
        return new optional<>(value);
    }

    public static <t> optional<t> ofnullable(t value) {
        return value == null ? empty() : of(value);
    }

    public static <t> optional<t> empty() {
        @suppresswarnings("unchecked")
        optional<t> t = (optional<t>) empty;
        return t;
    }

    public boolean ispresent() {
        return value != null;
    }

    public t get() {
        if (value == null) {
            throw new nosuchelementexception("no value present");
        }
        return value;
    }

    // 其他方法省略...
}

上述是 optional 类的简化版本,其中包含了 of() 方法的源码。关键部分解析如下:

  • emptyoptional 类的一个静态常量,表示空的 optional 对象。
  • value:私有字段,用于保存包装的值。
  • of(t value):静态工厂方法,用于创建包含非空值的 optional 对象。
  • ofnullable(t value):静态工厂方法,用于创建包含可能为 null 值的 optional 对象。
  • empty():静态工厂方法,用于创建空的 optional 对象。
  • ispresent():判断 optional 对象是否包含值。
  • get():获取 optional 对象中的值,如果值为空则抛出 nosuchelementexception

6. optional.of() 源码解析

现在我们来看一下 optional.of() 方法的源码:

public static <t> optional<t> of(t value) {
    return new optional<>(value);
}

这个方法非常简单,它直接调用 optional 类的私有构造函数 private optional(t value) 来创建一个新的 optional 对象,并将传入的值包装在其中。

private optional(t value) {
    this.value = objects.requirenonnull(value);
}

在构造函数中,首先通过 objects.requirenonnull(value) 确保传入的值非空,否则抛出 nullpointerexception。然后将非空值保存在 value 字段中。

这就是 optional.of() 方法的基本逻辑。总体来说,optional 类提供了一种安全地处理可能为 null 值的方式,而 optional.of() 则是其中的一个关键方法,用于创建包含非空值的 optional 对象。

4. 总结

optional.of() 是创建包含非空值的 optional 对象的方法。通过深入解析其语法、使用示例以及注意事项,我们更好地理解了该方法的作用和适用场景。在使用时,确保传入的值非空,以保证安全使用 optional。在不确定值是否为空的情况下,建议使用 optional.ofnullable() 方法。

附:optional.of()和optional.ofnullable()区别

optional.of()或者optional.ofnullable():创建optional对象,差别在于of不允许参数是null,而ofnullable则无限制。

// 参数不能是null,是null抛异常
optional<integer> optional1 = optional.of(1);
 
// 参数可以是null
optional<integer> optional2 = optional.ofnullable(null);
 
// 参数可以是非null
optional<integer> optional3 = optional.ofnullable(2);

空指针异常是导致java应用程序失败的最常见原因。以前,为了解决空指针异常,google公司著名的guava项目引入了optional类,guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到google guava的启发,optional类已经成为java 8类库的一部分。optional实际上是个容器:它可以保存类型t的值,或者仅仅保存null。optional提供很多有用的方法,这样我们就不用显式进行空值检测。

通过of(t value)函数所构造出的optional对象,当value值为空时,依然会报nullpointerexception。

到此这篇关于java中optional.of()方法及源码解析的文章就介绍到这了,更多相关java optional.of()方法源码解析内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com