教你使用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面向对象编程文章查看此处

相关文章
|
1月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
27天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
44 8
|
27天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
60 1
|
1月前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
52 4
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
115 4
|
1月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
26 0
|
存储 Java 编译器
Java语言------图书馆管理系统(入门简略版)
Java语言------图书馆管理系统(入门简略版)
126 0
Java语言------图书馆管理系统(入门简略版)
|
小程序 安全 前端开发
【Java编程进阶】Java语言基础入门篇
整个Java全栈编程知识体系十分庞大,包括JavaSE知识,Web前端,Web后端,数据库相关的知识等,初学者应该系统踏实的学习,一步一个脚印。Java语言是一种完全面向对象的跨平台语言。有很多突出的优点,例如简单易学,面向对象,分布式,安全可靠,解释型语言,跨平台运行,可移植高性能多线程,可实现网络编程等。
186 0
【Java编程进阶】Java语言基础入门篇
|
Java
Java学习路线-53:EL(表达式语言)入门及 EL 函数库
Java学习路线-53:EL(表达式语言)入门及 EL 函数库
124 0
下一篇
DataWorks