假设我们有一个名为Intersection的类,使用findIntersect(line1, line2)
方法。它返回一个名为point
的对象,其中包含x
和y
坐标的2个字段。现在,如果输入是2条平行线,那么与用户无法获得结果的最佳通信方式是什么?虽然示例是特定于行的,但问题是通用的 - 假设一个方法返回值对象,如果条件不匹配则返回什么?一些选项是:
null
(问题:在很多地方读取,如果可能,应该避免使用null返回值)hasNext()
中的Iterator
?Exception
?请让我知道最佳方法。
答案 0 :(得分:11)
无论你做什么,记录它。作为函数的调用者,我希望在方法的JavaDoc中清楚地描述确切的行为,特别是边缘情况。
在这种特殊情况下,我可能会返回Optional<Point>
。 Optional
非常好,因为它非常清楚地表明某个值可能不存在。一个理智的API永远不会 - 从不 - 如果声明的返回类型为null
,则返回Optional
。
答案 1 :(得分:1)
答案 2 :(得分:1)
我建议您制作一个条件,如果输入无效,将阻止程序继续执行该方法,然后通知用户。这样,您就不必调整对象点。
答案 3 :(得分:0)
你的第二种选择似乎很理想......
如果不满足某些条件,你不想返回null - null并不意味着“不存在”,它基本上意味着转义序列。
通常仅在执行内部计算时尝试异常(尝试读取不存在的文件,特定变量的格式等)。抛出异常会警告用户执行了非法操作...未找到交集并不意味着发现了非法的东西,而是返回虚假的东西。
调用布尔函数首先测试特定交集是否存在会更“干净”,如果存在,则调用下一个函数来查找它。
另一个选项是else语句,在findIntersect()的所有迭代运行之后...如果找到了交集,则返回它,否则返回一些指示没有交集的其他对象(例如-1,-1)
希望这有帮助。