2

假设我们有一个名为 Intersection 的类,它有一个findIntersect(line1, line2)方法。它返回一个名为 的对象point,其中包含 2 个字段xy坐标。现在,如果输入是 2 条平行线,那么与用户沟通没有获得结果的最佳方式是什么?尽管示例特定于行,但问题是通用的 - 假设方法返回值对象,如果条件不匹配返回什么?一些选项是:

  1. 返回null(问题:在许多地方读到,如果可能的话,应该避免空返回值)
  2. 在 object 中有一个方法来确定 object 是否有效,类似于hasNext()in Iterator
  3. 扔一个Exception

请让我知道最好的方法。

4

4 回答 4

11

无论你做什么,都要记录下来。作为函数的调用者,我希望在方法的 JavaDoc 中清楚地描述确切的行为,特别是对于边缘情况。

在这种特殊情况下,我可能会返回一个Optional<Point>. Optional非常好,因为它非常清楚地传达了一个值可能不存在。如果声明的返回null类型是Optional.

更多阅读:使用和避免 null避免 != null 语句

于 2013-08-02T03:57:27.043 回答
1
  1. 应该非常小心返回空值。您的 API 用户将不得不使用空检查来膨胀他们的代码。
  2. 一个好的解决方案,让一个对象决定它是否处于有效状态。如果不是,则默认为预定义状态。
  3. 一个可能的解决方案,如果它在您的 API 的情况下有意义。例如:用户是否允许通过 2 条平行线?
于 2013-08-02T03:58:56.787 回答
1

我建议您制定一个条件,如果输入无效,则阻止程序继续执行该方法,然后通知用户。这样,您不必调整对象点。

于 2013-08-02T05:56:16.713 回答
0

你的第二个选择似乎很理想......

确实,如果某些条件不满足,您不想返回 null - null 并不意味着“不存在”,它基本上意味着转义序列。

异常通常仅在执行内部计算时引发(尝试读取不存在的文件、特定变量的格式等)意味着发现了非法的东西,而是返回false。

调用一个布尔函数来首先测试一个特定的交集是否存在会更“干净”,如果存在,然后调用你的下一个函数来找到它。

另一种选择是 else 语句,在 findIntersect() 的所有迭代运行之后...如果找到交集,则返回它,否则返回一些其他表示没有交集的对象(例如 -1,-1)

希望这可以帮助。

于 2013-08-02T04:05:58.833 回答