在java中返回对象的最佳实践

时间:2013-08-02 03:55:36

标签: java design-patterns

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

  1. 返回null(问题:在很多地方读取,如果可能,应该避免使用null返回值)
  2. 在object中有一个方法来确定对象是否有效,类似于hasNext()中的Iterator
  3. 抛出Exception
  4. 请让我知道最佳方法。

4 个答案:

答案 0 :(得分:11)

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

在这种特殊情况下,我可能会返回Optional<Point>Optional非常好,因为它非常清楚地表明某个值可能不存在。一个理智的API永远不会 - 从不 - 如果声明的返回类型为null,则返回Optional

更多阅读:Using and avoiding nullAvoiding != null statements

答案 1 :(得分:1)

  1. 关于返回空值应该非常小心。您的API用户必须使用空检查来扩展其代码。
  2. 一个好的解决方案,让对象决定它是否处于有效状态。如果不是,则默认为预定义状态。
  3. 一种可能的解决方案,如果在您的API案例中有意义的话。例如:用户是否允许通过2条平行线?

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

通常仅在执行内部计算时尝试异常(尝试读取不存在的文件,特定变量的格式等)。抛出异常会警告用户执行了非法操作...未找到交集并不意味着发现了非法的东西,而是返回虚假的东西。

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

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

希望这有帮助。