zl程序教程

您现在的位置是:首页 >  其它

当前栏目

序列化禁止使用Optional

序列化 禁止 optional 使用
2023-09-11 14:17:19 时间

1: 概论

Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法

2: 例子:

很多博文一上来就给力以下使用例子

1 @Data
2 public class User {
3     private String name;
4     private Integer age;
5     private Optional<Address> address = Optional.empty();
6 }

1 @Data
2 public class Address {
3     private Optional<Street> street = Optional.empty();
4 }

1 @Data
2 public class Street {
3     private String streetName;
4     private Integer streetNo;
5 }

然后使用Optional 进行链式调用

1 public String getUserSteetName(User user) {
2 
3     Optional<User> userOptional = Optional.ofNullable(user);
4     final String streetName = userOptional.orElse(new User()).getAddress().orElse(new Address()).getStreet().orElse(new Street()).getStreetName();
5     return StringUtils.isEmpty(streetName) ? "nothing found" : streetName;
6 }

下面我们对这个类进行序列化与反序列化:

           ByteArrayOutputStream bos = new ByteArrayOutputStream();//序列化常规代码
            ObjectOutputStream obr = new ObjectOutputStream(bos);
            obr.writeObject(user);
            
            ByteArrayInputStream inputStream = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream inputStream2 = new ObjectInputStream(inputStream);
            User user = (Address) inputStream2.readObject();
            System.out.println(address2.getStreet().get().getStreetName());

 

抛出: Exception in thread "main" java.io.NotSerializableException: java.util.Optional 异常, 说明我们不能这样用,Optional 不支持Optional

 并且也没有实现相关的序列化接口

public final class Optional<T> {
    /**
     * Common instance for {@code empty()}.

 

 

3:总结

这说明了一个问题:

  • Java 8 提供大Optional 并不能支持序列化
  • 解决NPE,可以考虑在具体的业务逻辑中 使用Optional类提供相关的解决办法 比如Optional.of() 方法
  • Optional一方面的出现,主要还是配合Stream流,比如 reduce() findAny() findFirst()方法提供了返回Optional的操作接口

在实体类 千万不能使用Optional处理NPE,具体的处理逻辑在业务中处理,并且最好完整定义JOPO,不能嵌入无关逻辑,

 另一篇文章 : https://www.cnblogs.com/dgwblog/p/11759665.html