我想知道我是否应该通过验证方法调用的返回值是否符合我的期望来进行防御,即使我知道我正在调用的方法将满足此类期望也是如此。
给予
User getUser(Int id)
{
User temp = new User(id);
temp.setName("John");
return temp;
}
我应该做吗
void myMethod()
{
User user = getUser(1234);
System.out.println(user.getName());
}
要么
void myMethod()
{
User user = getUser(1234);
// Validating
Preconditions.checkNotNull(user, "User can not be null.");
Preconditions.checkNotNull(user.getName(), "User's name can not be null.");
System.out.println(user.getName());
}
我是在概念上问这个问题。如果我知道我正在调用的方法的内部工作原理。是因为我写了它,还是因为检查了它。它返回的可能值的逻辑符合我的先决条件。跳过验证是“更好”还是“更合适”,还是在继续执行我当前正在实现的方法之前,即使它总是可以通过,我仍然应该避免错误的值。
我从所有答案中得出的结论(请随意得出结论):
何时断言- 该方法在过去表现出不当行为
- 该方法来自不受信任的来源
- 该方法在其他地方使用,没有明确声明其后置条件
- 该方法与您的方法紧密相关(有关详细信息,请参见选择的答案)
- 该方法使用适当的文档,类型安全性,单元测试或后置条件检查等明确定义其合同。
- 性能至关重要(在这种情况下,调试模式声明可以用作混合方法)
Null
)?如果名称是""
(不是null而是空字符串)或,可能也同样有问题"N/A"
。您要么可以信任结果,要么必须适当地偏执。