前言
作为一名javaer,java.lang.NullPointerException
(简称:NPE) 应该是我们最常见的异常之一,为了避免这个问题,通常我们会在可能出现null的地方进行if检测,在某些时候可能造成很深层次的嵌套,导致代码膨胀 (代码数变多) 、可读性变差,维护也变得异常艰难。为了解决这个问题,Java8中引入了Optional类。本章我们将围绕Optional类进行讲解,希望大家通过本章可以对Optional有新的认识!
简介
Optional是一个支持存放泛型类型值的容器对象,其存放的值可以为空,也可以为非空。Optional能通过自身的容器方法判断值是否存在,和获取容器中存放的值。
案例准备
我们准备一个房子(House
),房子有门(Door
),门包含一个类型(Type
),有一个获取类型名称的方法getDoorTypeName
@Data
public class House {
private Door door;
public String getDoorTypeName() {
return door.getType().getName();
}
@Data
static class Door {
private Type type;
}
@Data
static class Type {
private String name;
}
}
NPE演示
获取门的类型名称
public void testNPE(){
System.out.println(new House().getDoorTypeName()); // java.lang.NullPointerException
}
if解决NPE
House中增加getOptimizeDoorTypeName
方法,方法内部进行为空判断
public String getOptimizeDoorTypeName() {
if (door != null) {
Type type = door.getType();
if (type != null) {
return type.getName();
}
}
return "未知类型";
}
上述方法存在一个问题,如果属性嵌套层次比较深,一直用if判断,代码可以说是相当膨胀了,对于这个问题,我们赶快请出本文介绍的主人公Optional
吧!
Optional使用指南
Optional是一个final修饰的类,不能被继承。打开源码查看你会发现它的构造函数也是私有的,说明我们也不能在外部使用关键字new进行创建,当然Java的设计者不会自绝后路,Optional提供了更加方便的of和ofNullable来进行构建Optional对象!
Optional容器创建方法
- 创建方法一览表
方法 | 备注 |
---|---|
public static Optional empty() | 返回一个空容器,内部值为空 |
public static Optional of(T value) | 根据value创建一个容器,value不允许为空,如果为空抛出NPE异常 |
public static Optional ofNullable(T value) | 根据value创建一个容器,value为空等同于empty() 、不为空等同于of() |
- 代码演示
public void testOptional(){
Optional<House> houseEmpty = Optional.empty();
Optional