我最近读过几本关于干净代码和重构的书,尤其是前者倾向于建议读者都不返回null
,也不将其传递到任何功能中(外国,(对您(不可变的代码,例如官方库或外部框架,排除在外(。例如,请参见 Robert C. Martin-清洁代码:敏捷软件手工艺手册,第110-112页(第六印刷(。
根据我的经验,这通常是有道理的。您通常可以抛出异常,返回空列表或数组,或者使用一些创造性解决方案来避免NullPointerException
的可能性,而不是null
。当然,您可能必须捕获自己的例外 - 但这仍然比通用NullPointerException
更具表现力。
然后,我考虑了您是否应该完全避免null
- 即不仅在函数呼叫或返回语句中,而是 everywhere 。据我所知,这应该既可能又合理。
但是 - 仍然是学生 - 我不确定该假设/准则是否总是正确的。因此我的问题:
您是否应该始终尝试避免以任何代价使用null
?还是尽管有NullPointerExceptions
的风险,但使用它的情况还是更实用的解决方案?忽略您必须处理无法影响的外国代码的情况,例如官方库。
我认为您通常应该避免使用它,但我认为它可以用于内存管理。例如,您可能需要将一些简短的生命对象设置为null
,然后将它们与垃圾收集器发出信号。
它是更多基于意见的,但是由于语言规格允许使用null
,并且存在返回null
的本机方法的存在,例如HashMap#get(Object)
完全避免它是不可行的。
有时它用于初始化可变的对象....