Java:在永远不应该为 NULL 的变量上处理 NULL 情况的最佳实践/设计模式?

Java: Best practice/Design pattern for handling NULL cases on variables that SHOULD NEVER be NULL?

提问人:ennth 提问时间:9/8/2022 更新时间:9/8/2022 访问量:46

问:

我问了每个人,通常从每个人那里得到了不同的回答。

现在,有一个可能在Java中的变量,一般来说需要处理这种情况。我们可以做这样的事情:NULL

if(myVarThatCouldBeNull != null) {
   myVarThatCouldBeNull.getSomeValueFromMyVarThatCouldBeNull();
}

...这样,仅当 var 具有值时才调用 getter 方法(否则将抛出 Null Pointer Exception (NPE))。

我的问题是,对于绝对不应该的变量,假设您有一个考勤应用程序(我们称之为 API X),用于自动考勤。你可以有一个这样的模型/对象:NULLStudent

public class Student {
   private String firstName;
   private String lastName;
   private String email;
   private Integer id;
}

...现在我们可以假设或说,为了让学生“记录”他们的出勤情况,API X 从某个 API(我们称之为 API Y)读取/使用模型/对象的字段/属性作为 JSON 键/值对 POST'd。然后,API X 对来自 API 的请求进行反序列化。Student

由于我们已经说过记录出勤率是必需的,并且是 API X 的核心功能,因此它永远不应该是 .这可能是因为,也许有一个带有输入表单的 UI 网页来创建学生帐户,并且该字段是必填输入字段,学生在其中输入他们的学校 ID,否则他们无法完成注册(未创建用户帐户,因此不会将数据发送到后端应用程序,在这种情况下, API X,它将使用请求)。idNULLidid

因此,我的问题是 - 在这些情况下(后者),开发人员/开发人员是否仍然应该为空检查该字段?我的第一个想法是它是多余的,但话又说回来,这只是开发人员假设不需要它。如果有一个边缘情况会破坏 API (API X),而我们,开发人员/开发人员不知道,并且因为我们依赖于我们的假设(并且没有完全承诺对每个变量进行空检查),我们以后会遇到问题怎么办?id

话又说回来,我还可以看到(并且已经看到)带有用于检查的包装函数的代码库不必要地冗长,并混淆了代码库和流程。if(...)NULL

如果每个人都认为某些事情不需要空检查,我觉得好像没有人会做空检查。但是,是否真的有必要用条件语句(例如 if 语句)包装变量,就像本例中涉及用户在 UI 输入表单上输入的变量一样,如果没有在 UI 级别输入,就无法创建学生帐户?(后端系统稍后会在下游使用这个)?idid

我可能把这件事复杂化了,但我总体上很好奇,很想听听每个人的反应

Java 异常 设计模式 错误处理 null

评论

0赞 Basil Bourque 9/8/2022
提示:Objects.requireNonNullObjects.isNull 等。

答:

2赞 Iłya Bursov 9/8/2022 #1

您不能信任用户发送的数据,从不信任

通常,应用程序中有多个图层:

  1. 实际上接受用户输入并应执行验证的控制器,包括所有 null/非 null 检查
  2. 内部类,它实际上执行一些工作 - 这个类可以依靠上层来提供有效数据,从而省略验证

评论

0赞 Basil Bourque 9/8/2022
另一层是在数据库系统内执行的验证检查。
0赞 Iłya Bursov 9/8/2022
@BasilBourque是的,应该保护不同系统之间的每个边界
0赞 Guru Stron 9/8/2022 #2

所有面向客户端的 API(如果库对传入数据/设置等有限制,则同样有效)都应该对传入数据执行验证(即使客户端实际上是系统中的另一个服务,如果是分布式的)。即使我们摒弃恶意,对您来说绝对显而易见的事情对其他用户/开发人员来说可能并不那么清楚/明显。

在验证传入数据之后 - 这取决于您的应用程序的编写和结构方式,但在那里您可以放松检查,至少在某种程度上是这样(即通常重新验证已验证的数据意义不大)。