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

上一篇:教你借助占位符定制资源内容 | 带你学《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);

教你使用UUID、Optional类 | 带你学《Java语言高级特性》之三十一
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面向对象编程文章查看此处

上一篇:触摸Java世界的核心:类与对象 | 带你学《Java面向对象编程》之一


下一篇:吊打IBM的芯片 中国研发出第一款类脑芯片