在方法中返回对象(如Document
时,创建不是implements AutoCloseable
时,我经常看到声明对象的第一行并在最后返回:
public Document myMethod() {
Document document = null
try {
document = docFactory.newDocumentBuilder().newDocument();
//...work on document
} catch(Exception e) {
// Handle Exception
}
return document;
}
以下规则似乎总是正确的,在try子句中创建并返回(并且可以将此代码提取到method)
public Document myMethod() {
try {
Document document = docFactory.newDocumentBuilder().newDocument();
//...work on document
return document;
} catch(Exception e) {
// Handle Exception
}
return null;
}
我错过了什么吗? (您可以将null
设为默认值,但重要性不高的情况)
答案 0 :(得分:1)
在方法的末尾仅包含一个return
语句曾经被教为提高可读性的样式指南。也许仅仅是出于习惯,当我从事的项目没有既定风格时,仍然是我的偏爱。
但是,真正起作用的唯一情况是很长的复杂方法,无论如何应该分解。
给出良好的编码习惯(例如,测试适当的单元测试范围,因此您知道在任何相关条件下(包括例外情况)都将返回正确的内容),这实际上只是团队/项目偏好的问题。
答案 1 :(得分:0)
除了第二个代码块具有catch(Exception e
)子句之外,它们实际上是等效的。
对于此代码,是否愿意优先考虑
try
块之外将变量初始化为null,然后在末尾返回对象如果您想在try块外的Object o
上进行操作,则需要在该块外初始化变量,以使其具有适当的作用域和可用范围。
某些编码器遵循约定,即每个方法仅尝试使用1个return语句。 (我不是其中之一)。
对于您的要求,这似乎是个人喜好问题。
答案 2 :(得分:0)
这里的大多数答案/评论表明,这两种方法之间并没有真正的区别,并且它们在功能上是相同的,而这只是偏好问题。
这是不正确的,在功能上有非常重要的区别。如果//...work on document
中发生异常,则第一个解决方案将返回未完成或可能损坏的文档(除非return null;
块中的// Handle Exception
是),而第二个选项将返回null。
因此,我建议使用选项2),因为它可以减少从方法中返回损坏的文档的风险,这种方法您可能不会立即注意到,并且可能导致其他问题,而返回null
是明确的表示您的方法出了点问题。