首页 > 其他 > 详细

序列化禁止使用Optional

时间:2019-10-29 15:40:19      阅读:127      评论:0      收藏:0      [点我收藏+]

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,不能嵌入无关逻辑,

 

序列化禁止使用Optional

原文:https://www.cnblogs.com/dgwblog/p/11758240.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!