提问人:ennth 提问时间:9/8/2022 更新时间:9/8/2022 访问量:46
Java:在永远不应该为 NULL 的变量上处理 NULL 情况的最佳实践/设计模式?
Java: Best practice/Design pattern for handling NULL cases on variables that SHOULD NEVER be NULL?
问:
我问了每个人,通常从每个人那里得到了不同的回答。
现在,有一个可能在Java中的变量,一般来说需要处理这种情况。我们可以做这样的事情:NULL
if(myVarThatCouldBeNull != null) {
myVarThatCouldBeNull.getSomeValueFromMyVarThatCouldBeNull();
}
...这样,仅当 var 具有值时才调用 getter 方法(否则将抛出 Null Pointer Exception (NPE))。
我的问题是,对于绝对不应该的变量,假设您有一个考勤应用程序(我们称之为 API X),用于自动考勤。你可以有一个这样的模型/对象:NULL
Student
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,它将使用请求)。id
NULL
id
id
因此,我的问题是 - 在这些情况下(后者),开发人员/开发人员是否仍然应该为空检查该字段?我的第一个想法是它是多余的,但话又说回来,这只是开发人员假设不需要它。如果有一个边缘情况会破坏 API (API X),而我们,开发人员/开发人员不知道,并且因为我们依赖于我们的假设(并且没有完全承诺对每个变量进行空检查),我们以后会遇到问题怎么办?id
话又说回来,我还可以看到(并且已经看到)带有用于检查的包装函数的代码库不必要地冗长,并混淆了代码库和流程。if(...)
NULL
如果每个人都认为某些事情不需要空检查,我觉得好像没有人会做空检查。但是,是否真的有必要用条件语句(例如 if 语句)包装变量,就像本例中涉及用户在 UI 输入表单上输入的变量一样,如果没有在 UI 级别输入,就无法创建学生帐户?(后端系统稍后会在下游使用这个)?id
id
我可能把这件事复杂化了,但我总体上很好奇,很想听听每个人的反应
答:
您不能信任用户发送的数据,从不信任
通常,应用程序中有多个图层:
- 实际上接受用户输入并应执行验证的控制器,包括所有 null/非 null 检查
- 内部类,它实际上执行一些工作 - 这个类可以依靠上层来提供有效数据,从而省略验证
评论
所有面向客户端的 API(如果库对传入数据/设置等有限制,则同样有效)都应该对传入数据执行验证(即使客户端实际上是系统中的另一个服务,如果是分布式的)。即使我们摒弃恶意,对您来说绝对显而易见的事情对其他用户/开发人员来说可能并不那么清楚/明显。
在验证传入数据之后 - 这取决于您的应用程序的编写和结构方式,但在那里您可以放松检查,至少在某种程度上是这样(即通常重新验证已验证的数据意义不大)。
评论
Objects.requireNonNull
、Objects.isNull
等。