教你使用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 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
22 3
|
5天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
5天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
34 10
|
6天前
|
Java 编译器
Java Character 类
4月更文挑战第13天
|
7天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
10天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
11天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
12 0
|
11天前
|
Java
Java 15 神秘登场:隐藏类解析未知领域
Java 15 神秘登场:隐藏类解析未知领域
15 0
|
12天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
21 9
|
安全 Java
JAVA8实战 - Optional工具类(下)
JAVA8实战 - Optional工具类(下)
423 0

热门文章

最新文章