我可以确定名为returnlist()的'我的代码'永远不会返回null。因此,当我在增强的for循环中循环时,我不进行任何空指针检查。但是,从维护看起来这看起来并不是一个好习惯,因为将来某人可能会无意中修改代码库,或者有人会覆盖此调用,并且覆盖函数可能不够谨慎以返回空集合。
public class ExtendedForLoop {
public List<Integer> returnList() {
// compute.
if list == null ? Collections.emptyCollections : list;
}
public static void main(String args[]) {
for (Integer i : returnList()) {
System.out.println(i);
}
}
因此,提出问题通用,问题是要了解在何处绘制权衡线的最佳实践。我完全理解这些案例没有明确的规则,只是寻求最佳实践。
在自编代码中添加过多的检查会增加混乱,但可确保其在将来修改时的安全性。
减少检查因为“你知道它不会返回null”会使代码变得干净,但是我们有意外修改的风险。
答案 0 :(得分:1)
如果您关心关于代码演变的这一方面,您应该:
文档旨在供开发人员使用,但受压力的开发人员采用快速阅读技术,这会降低他们对细节的理解。
如果您对代码的所需属性所有进行编码,则可以从客户端删除此类检查。但请注意,测试必须保持不变。虽然CI默认情况下确保所有正在运行的测试都通过,但它没有说明缺少测试。
不幸的是,您无法强制所有必需的单元测试都已在CI过程中编写。您所能做的就是强制执行最低100%的代码覆盖率,以确保代码的最小次数。
But the code won't be perfect, nevertheless.
最佳做法是诚实地做你付出的代价。
这意味着如果您编写的原型或应用程序不需要可靠,您就不应该关心这些问题!
相反,如果您正在编写(比方说)手术机器人的控制器,您应该通过测试和完全更新的文档确保至少100%的覆盖率(并且仍然准备导致一些死亡)。
可靠性与其他任何功能一样:应该对其进行估算,支付和衡量。
答案 1 :(得分:0)
这就是javadoc的用途:
只需添加:
/**
* @return the list, or an empty List. Never returns null!
*/
public List<Integer> returnList()
此外,如果代码在安装在400.000车辆中的嵌入式设备中运行,您可以添加额外的空检查,尽管您确定。你想避免回电那些设备来阻碍所有情况。
如果它在一台服务器上运行,您可以依赖正确的实施。