Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法
很多博文一上来就给力以下使用例子
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()}.
这说明了一个问题:
在实体类 千万不能使用Optional处理NPE,具体的处理逻辑在业务中处理,并且最好完整定义JOPO,不能嵌入无关逻辑,
原文:https://www.cnblogs.com/dgwblog/p/11758240.html