【问题标题】:Return a Document in a method在方法中返回一个文档
【发布时间】:2019-02-04 07:04:46
【问题描述】:

当在方法中返回一个对象(如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子句中创建并返回(并且可以将这段代码提取到方法中)

public Document myMethod() {

 try {
    Document document  = docFactory.newDocumentBuilder().newDocument();
    //...work on document
    return document;
 } catch(Exception e) {
    // Handle Exception
 }
 return null;
}

我错过了什么吗? (您可以将null 可以是默认值但不那么重要的情况联系起来)

【问题讨论】:

  • 我不确定你的问题是什么。我只能说第二个选项可能更安全,因为如果创建文档时出现异常,则返回 null 而不是可能损坏/未完成的文档。
  • @kajacx 这是一个答案,只是想知道我总是/几乎总是可以改变这些方法
  • 请不要捕捉异常,而是特定的异常。
  • @WesleyDeKeirsmaeker 是的,请忽略异常,我试图概括具体问题,具体代码为ParserConfigurationException

标签: java return-value default-value


【解决方案1】:

除了第二个代码块有一个catch(Exception e) 子句之外,它们实际上是等效的。

对于这段代码,是否愿意是一个偏好问题

  • try块外初始化变量为null,并在最后返回对象
  • 在try块内声明变量,最后返回null

如果您想在 try 块外对 Object o 进行操作,那么您需要在块外初始化变量,使其具有适当的作用域并可用。

一些编码人员遵守约定,他们尝试每个方法只有 1 个返回语句。 (我不是其中之一)。

对于您的要求,这似乎是个人喜好问题。

【讨论】:

  • 我在第一个子句中添加了catch(Exception e),提取内部方法不是更突出的选择吗?
  • 这两种方法都非常合适。老实说,我不能说哪种方法最突出。您会看到在各种代码库中都采用了这两种方法,这两种方法都很好。唯一的区别是变量范围,如果需要的话。
【解决方案2】:

在方法的末尾只有一个 return 语句曾经被教导为提高可读性的风格指南。或许只是出于习惯,在从事没有既定风格的项目时,我仍然偏爱它。

然而,唯一真正发挥作用的情况是长而复杂的方法,无论如何都应该分解。

鉴于良好的编码实践(例如,测试适当的单元测试覆盖率,以便您知道在任何相关条件下返回正确的东西,包括异常),这实际上只是团队/项目偏好的问题。

【讨论】:

  • 感谢您的回答,只是一个跟进,尝试资源功能是不是引入了一种在 try 块内创建和处理对象而不是在块外创建和使用它的新方法?
  • 该问题未解决 try-with-resources 语法。如果您想询问有关此类语法的问题,请随时将其作为问题发布。 (问题不属于 cmets,因为这会将信息隐藏在难以阅读的格式中。并且不建议以改变其范围的方式编辑现有问题,因为这会使现有答案对未来的搜索者不太有用.)
【解决方案3】:

这里的大多数答案/cmets 表明这两种方法之间没有真正的区别,并且它们在功能上是相同的,这只是一个偏好问题。

这不是真的,有一个非常重要的功能区别。如果//...work on document 发生异常,第一个解决方案将返回一个未完成或可能损坏的文档(除非// Handle Exception 块中的return null;),而第二个选项将返回null。

因此,我建议使用选项 2),因为它降低了从您可能不会立即注意到的方法返回的损坏文档的风险,并可能导致其他地方出现问题,而返回 null 则明确表明你的方法出了点问题。

【讨论】:

  • “如果在 //...work on document 中发生异常,第一个解决方案将返回一个未完成或可能损坏的文档”。不,它将运行异常处理程序,该处理程序将决定应该返回什么。风格不是由编码人员不知道如何编码的假设决定的,并且知道在异常情况下返回什么的问题是由单元测试覆盖率解决的。
  • 首先,您可能没有阅读我答案的“(除非返回 null;在 //Handle Exception 块中)”部分,其次,“知道在异常情况下返回了什么无论如何都要通过单元测试覆盖来解决。”假设在“//...work on document”块中有一个异常测试用例,但情况可能并非如此,也许唯一有异常的测试是当它被“docFactory.newDocumentBuilder”抛出时().newDocument();"声明,或者可能根本没有针对此方法的单元测试。
  • “假设有一个测试用例......” 是的,在确定良好的编码实践时,我假设人们会遵循良好的编码实践。美好的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多