zoukankan      html  css  js  c++  java
  • 序列化禁止使用Optional

    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

  • 相关阅读:
    ASP.NET MVC 学习笔记 1
    安装xp遇到的问题与如何连接共享的打印机
    win8.1 安装
    AspxGridView控件的使用
    JS获取fileupload文件全路径
    正则表达式的学习
    回归起点
    Vmware ESX 5.0 安装与部署
    UITextField检测输入内容不能有空格的处理
    关于cell自动布局约束实现高度自适应问题
  • 原文地址:https://www.cnblogs.com/dgwblog/p/11758240.html
Copyright © 2011-2022 走看看