gpt4 book ai didi

java - 有没有更好的方法来处理深度嵌套数据的空异常?

转载 作者:行者123 更新时间:2023-12-04 09:15:27 25 4
gpt4 key购买 nike

我想知道是否有更好的方法来处理深度嵌套数据的空值?
假设我有 4 个类(class),即 大学 , 分公司 , 学生 , 信息嵌套在另一个周围。

class University{
Branch branch;
//getters & setters
}
class Branch{
Student student;
//getters & setters
}
class Student{
Information information;
//getters & setters
}
class Information{
String name;
List<Boolean> attendance;
//getters & setters
}
出于某种原因,我希望使用学生姓名,为此我们只需导航 university.getBranch().getStudent().getInformation().getName()这很容易引发空异常。
出于这个原因,我们总是放一个 if阻止它以检查空值,像这样 if(university != null && university.getBranch() != null ..... )在嵌套深度之上是 4,有时我有超过 8 或 9 的深度。在这些情况下,像上面这样的东西没有意义,我们宁愿牺牲干净的代码。
我需要一个更好的方法来解决这个问题

以下是我发现对它们自身局限性有帮助的几种方法:
  • 属性(property)来源 .getNestedProperty() - Apache 通用 beanUtils 库,除了抛出 NestedNullException 之外,它几乎对我有用需要使用 try{}catch(){} 处理出于某种原因,我们不想这样做。甚至在处理列表时也会出现问题。
  • 选件 - Java 8 提供了 final Class Optional
  • *Traditional Way :*
    if (university != null) {
    Branch branch = user.getBranch();
    if (branch != null) {
    Student student = branch.getStudent();
    if (student != null) {
    Information info = student.getInformation();
    if (info != null) {
    name = info.getName();
    }
    }
    }
    }

    *Java 8 Optionals :*
    Optional<String> optional = Optional.ofNullable(user)
    .flatMap(University::getBranch)
    .flatMap(Branch::getStudent)
    .map(Student::getInformation)
    .orElse("default");


    代码现在看起来很干净,除了我们需要为每个 Optional 创建一个对象(如果我们想多次使用该可选)
  • 第三种方式是 JSONfying 使用 Object Mapper 的整个对象并直接获取该数据
  • responseEntityJson = objectMapper.writeValueAsString(responseEntity);
    rootNode = objectMapper.readTree(responseEntityJson);
    DataValue = rootNode.findValue("Data");
    我很期待知道你的意见。

    最佳答案

    恕我直言,最好避免尽可能多的对象出现空值的可能性。
    例如,如果您的大学有一个/一组学生列表,getStudents()永远不应该返回 null .不过,它可能会返回一个空集合。如果University class 确保 getStudents()一去不复返null ,您可以跳过 getStudents() 的空检查无论你叫它。
    此外,对于 getter 可以接收的许多其他值,它们在逻辑上应该永远不会为 null,所以只要让对象确保它永远不会返回 null。如果该字段是不可变的,您可以在构造函数中检查空值,然后确保您永远不会收到 null .
    如果真的可以缺席,Optional是一个不错的选择。

    关于java - 有没有更好的方法来处理深度嵌套数据的空异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63245608/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com