教你使用UUID、Optional类 | 带你学《Java语言高级特性》之三十一

简介: 在项目运行中通常会遇到大批量用户、资源文件命名问题、空指针传递异常等问题,为了解决这些问题,Java推出了UUID来生成不重复字符串、使用Optional类来处理空值。

上一篇:教你借助占位符定制资源内容 | 带你学《Java语言高级特性》之三十
在项目运行中通常会遇到大批量用户、资源文件命名问题、空指针传递异常等问题,为了解决这些问题,Java推出了UUID来生成不重复字符串、使用Optional类来处理空值。

【本节目标】
通过阅读本节内容,你可以了解到UUID类生成字符串的原理,并能使用UUID类实现字符串的获取与反向计算UUID内容,灵活运用Optional类提供的各种方法处理程序中可能会出现的null值问题。

UUID类

UUID是一种生成无重复字符串的程序类,这种程序类的主要功能是根据时间戳实现一个自动的无重复的字符串定义。
一般在获取UUID时候往往都是随机生成的一个的内容,所以可以通过如下方式获取:

  • 获取UUID对象:public static UUID randomUUID();
  • 根据字符串获取UUID内容:public static UUID fromString(String name);
import java.util.UUID;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        UUID uid=UUID.randomUUID();
        System.out.println(uid.toString());  //8fb68484-e744-48e8-88d1-4063d2728d26
    }
}

在对一些文件进行自动命名处理的情况下,UUID类型非常好用。

Optional类

Optional类的主要功能是进行null的相关处理,在以前进行程序开发的时候,如果为了防止程序中出现空指向异常,往往追加有null的验证。

范例:传统的引用传递问题

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        MessageUtil.useMessage(MessageUtil.getMessage());
    }
}
class MessageUtil{
    private MessageUtil(){};
    public static IMessage getMessage(){
        return null;
    }
    public static IMessage useMessage(IMessage msg){     
        if(msg!=null){
            System.out.println(msg.getContent());  //有可能因为null,导致空指向
        }
    }
}
interface IMessage{
    public String getContent();
}
class MessageImpl implements IMessage{
    @Override
    public String getContent() {
        return "www.mldn.cn";
    }
}

在引用接收的一方往往都是被动的进行判断,所以为了解决这种被动的处理操作,在Java类中提供有一个Optional类,这个类可以实现null的处理操作。在这个类里面提供有如下的一些操作方法:

  • 返回空数据:public static Optional empty();
  • 获取数据:public T get();
  • 保存数据,但是不允许出现null:public static Optional of(T value);

    • 如果在保存数据的时候存在有null,则会抛出NullPointerException异常;
  • 保存数据,允许为空:public static Optional ofNullable(T value);
  • 空的时候返回其他数据:public T orElse(T other);

image.png
Optional类

范例:修改程序,按照正规的结构完成

import java.util.Optional;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        MessageUtil.useMessage(MessageUtil.getMessage().get());//获取数据
        MessageUtil.useMessage(temp);
    }
}
class MessageUtil{
    private MessageUtil(){};
    public static Optional<IMessage> getMessage(){
        IMessage message=new MessageImpl();
        return Optional.of(new MessageImpl());//有对象
    }
    public static void useMessage(IMessage msg){ 
        if(msg!=null){
            System.out.println(msg.getContent()); //有可能因为null,导致空指向
        }   //www.mldn.cn
    }
}
interface IMessage{
    public String getContent();
}
class MessageImpl implements IMessage{
    @Override
    public String getContent() {
        return "www.mldn.cn";
    }
}

如果说现在数据保存的内容为null,则就会在保存处出现异常:

public static Optional<IMessage> getMessage(){
        return Optional.of(null);//有对象
    }    //java.lang.NullPointerException

由于Optional类中允许保存有null的内容,所以在数据获取时也可以进行null的处理,但是如果为null,则在使用get()获取数据的时候就会出现“java.util.NoSuchElementException:No value present”异常信息,所以此时可以更换为orElse()方法。

范例:处理null

import java.util.Optional;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        IMessage message=MessageUtil.getMessage().orElse(new MessageImpl());//获取数据
        MessageUtil.useMessage(temp);
    }
}
class MessageUtil{
    private MessageUtil(){};
    public static Optional<IMessage> getMessage(){
        return Optional.ofNullable(null);//有对象
    }
    public static void useMessage(IMessage msg){
        if(msg!=null){
            System.out.println(msg.getContent());//有可能因为null,导致空指向
        }  //www.mldn.cn
    }
}
interface IMessage{
    public String getContent();
}
class MessageImpl implements IMessage{
    @Override
    public String getContent() {
        return "www.mldn.cn";
    }
}

在所有引用数据类型的操作处理之中,null是一个重要的技术问题,所以JDK1.8后提供的Optional类对于null的处理很有帮助,同时也是在日后进行项目开发之中使用次数很多的一种程序类。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:借助ThreadLocal实现多线程安全 | 带你学《Java语言高级特性》之三十二
更多Java面向对象编程文章查看此处

相关文章
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
165 57
|
18天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
68 8
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
31 0
|
5天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
44 17
|
16天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
1天前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题