Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to use Optional in Nacos

2025-04-04 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/03 Report--

本篇内容主要讲解"如何使用Nacos中的Optional",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用Nacos中的Optional"吧!

Nacos中的Optional使用

在Nacos中有这样一个接口ConsistencyService,用来定义一致性服务的,其中的一个方法返回的类型便是Optional:

/** * Get the error message of the consistency protocol. * * @return the consistency protocol error message. */ Optional getErrorMsg();

如果你对Optional不了解,看到这里可能就会有点蒙。那我们来看看Nacos是怎么使用Optional的。在上述接口的一个实现类PersistentServiceProcessor中是如此实现的:

@Override public Optional getErrorMsg() { String errorMsg; if (hasLeader && hasError) { errorMsg = "The raft peer is in error: " + jRaftErrorMsg; } else if (hasLeader && !hasError) { errorMsg = null; } else if (!hasLeader && hasError) { errorMsg = "Could not find leader! And the raft peer is in error: " + jRaftErrorMsg; } else { errorMsg = "Could not find leader!"; } return Optional.ofNullable(errorMsg); }

也就是根据hasLeader和hasError两个变量来确定返回的errorMsg信息是什么。最后将errorMsg封装到Optional中进行返回。

下面再看看方法getErrorMsg是如何被调用的:

String errorMsg; if (ephemeralConsistencyService.getErrorMsg().isPresent() && persistentConsistencyService.getErrorMsg().isPresent()) { errorMsg = "'" + ephemeralConsistencyService.getErrorMsg().get() + "' in Distro protocol and '" + persistentConsistencyService.getErrorMsg().get() + "' in jRaft protocol"; }

可以看到在使用时只用先调用返回的Optional的isPresent方法判断是否存在,再调用其get方法获取即可。此时你可以回想一下如果不用Optional该如何实现。

到此,你可能有所疑惑用法,没关系,下面我们就开始逐步讲解Option的使用、原理和源码。

Optional的数据结构

面对新生事物我们都会有些许畏惧,当我们庖丁解牛似的将其拆分之后,了解其实现原理,就没那么恐怖了。

查看Optional类的源码,可以看到它有两个成员变量:

public final class Optional { /** * Common instance for {@code empty()}. */ private static final Optional EMPTY = new Optional(null); /** * If non-null, the value; if null, indicates no value is present */ private final T value; // ... }

其中EMPTY变量表示的是如果创建一个空的Optional实例,很显然,在加载时已经初始化了。而value是用来存储我们业务中真正使用的对象,比如上面的errorMsg就是存储在这里。

看到这里你是否意识到Optional其实就一个容器啊!对的,将Optional理解为容器就对了,然后这个容器呢,为我们封装了存储对象的非空判断和获取的API。

看到这里,是不是感觉Optional并没那么神秘了?是不是也没那么恐惧了?

而Java 8之所以引入Optional也是为了解决对象使用时为避免空指针异常的丑陋写法问题。类似如下代码:

if( user != null){ Address address = user.getAddress(); if(address != null){ String province = address.getProvince(); } }

原来是为了封装,原来是为了更优雅的代码,这不正是我们有志向的程序员所追求的么。

如何将对象存入Optional容器中

这么我们就姑且称Optional为Optional容器了,下面就看看如何将对象放入Optional当中。

看到上面的EMPTY初始化时调用了构造方法,传入null值,我们是否也可以这样来封装对象?好像不行,来看一下Optional的构造方法:

private Optional() { this.value = null; } private Optional(T value) { this.value = Objects.requireNonNull(value); }

存在的两个构造方法都是private的,看来只能通过Optional提供的其他方法来封装对象了,通常有以下方式。

empty方法

empty方法源码如下:

// Returns an {@code Optional} with the specified present non-null value. public static Optional of(T value) { return new Optional(value); }

简单直接,直接强转EMPTY对象。

of方法

of方法源码如下:

public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; }

注释上说是为非null的值创建一个Optional,而非null的是通过上面构造方法中的Objects.requireNonNull方法来检查的:

public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; }

也就是说如果值为null,则直接抛空指针异常。

ofNullable方法

ofNullable方法源码如下:

public static Optional ofNullable(T value) { return value == null ? empty() : of(value); }

ofNullable为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。也就是说此方法支持对象的null与非null构造。

回顾一下:Optional构造方法私有,不能被外部调用;empty方法创建空的Optional、of方法创建非空的Optional、ofNullable将两者结合。是不是so easy?

此时,有朋友可能会问,相对于ofNullable方法,of方法存在的意义是什么?在运行过程中,如果不想隐藏NullPointerException,就是说如果出现null则要立即报告,这时就用Of函数。另外就是已经明确知道value不会为null的时候也可以使用。

判断对象是否存在

上面已经将对象放入Optional了,那么在获取之前是否需要能判断一下存放的对象是否为null呢?

isPresent方法

上述问题,答案是:可以的。对应的方法就是isPresent:

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

实现简单直白,相当于将obj != null的判断进行了封装。该对象如果存在,方法返回true,否则返回false。

isPresent即判断value值是否为空,而ifPresent就是在value值不为空时,做一些操作:

public void ifPresent(Consumer

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report