在java中返回对象的最佳实践
假设我们有一个名为intersect的类,它有一个在java中返回对象的最佳实践,java,design-patterns,Java,Design Patterns,假设我们有一个名为intersect的类,它有一个findIntersect(line1,line2)方法。它返回一个名为point的对象,其中包含两个字段x和y坐标。现在,如果输入是两条平行线,那么与用户进行通信的最佳方式是什么?虽然这个例子是特定于行的,但问题是通用的——假设一个方法返回值对象,如果条件不匹配,返回什么?有些选择是: Returnnull(问题:在许多地方阅读,如果可能,应避免使用null返回值) 在对象中有一个确定对象是否有效的方法,类似于迭代器中的hasNext() 抛出
findIntersect(line1,line2)
方法。它返回一个名为point
的对象,其中包含两个字段x
和y
坐标。现在,如果输入是两条平行线,那么与用户进行通信的最佳方式是什么?虽然这个例子是特定于行的,但问题是通用的——假设一个方法返回值对象,如果条件不匹配,返回什么?有些选择是:
null
(问题:在许多地方阅读,如果可能,应避免使用null返回值)迭代器中的hasNext()
异常
请让我知道最好的方法。无论您做什么,记录它。作为函数的调用者,我希望在方法的JavaDoc中清楚地描述确切的行为,特别是对于边缘情况 在这种情况下,我可能会返回一个
Optional
非常好,因为它非常清楚地表明可能不存在值。如果sane API声明的返回类型为可选
,则该API将永远不会–永远–返回null
更多阅读:和
你的第二个选择似乎很理想 如果不满足某些条件,您确实不希望返回null-null并不意味着“不存在”,它基本上意味着一个转义序列 异常通常仅在执行内部计算(试图读取不存在的文件、特定变量的格式等)时才会引发。引发异常会提醒用户执行了非法操作……未找到交集并不意味着找到了非法操作,而是返回false 首先调用布尔函数来测试是否存在特定的交集,如果存在交集,然后调用下一个函数来查找交集,这将更加“干净” 另一个选项是一个else语句,在运行findIntersect()的所有迭代之后…如果找到交集,则返回它,否则返回指示没有交集的其他对象(例如-1,-1)
希望这能有所帮助。我建议您设置一个条件,如果输入无效,将阻止程序继续使用该方法,然后通知用户。这样,您就不必调整对象点。就我个人而言,我喜欢空值。如果您无论如何都要检查有效性,空检查是快速、简单的,并且对任何编码人员都是可读的。只要我的两分钱。如果您使用的是
float
,则可以返回float.NaN
,但也可以在文档中解释它。请投票记录它。只要我能很容易地说出什么是回报,我就很高兴。始终记录边缘情况。无论您是否有checkParallel
方法,最终都会有人传入两条平行线,您必须以某种方式进行处理。我可能会抛出一个ParallelinesException扩展了IllegalArgumentException
,但无论您是这样做还是返回某种“无效”值,都应该确切地指定您的代码约定是什么。我知道它更容易阅读,但1和2每次都需要检查一个变量,因此,代码几乎同样会被它弄乱。可能的话,但是如果你确定
返回的对象将始终处于有效状态,你就不需要真正的防御检查之类的。“调用布尔函数来首先测试是否存在某个特定的交集,如果存在,然后调用下一个函数来找到它,这会更“干净”我不同意。我认为这一点都不干净,而且它做的工作是原来的两倍。此外,表示无交点的对象不能具有实值坐标(例如(-1,-1)
),因为实际笛卡尔平面无限大。我能看到的唯一合理的“空对象”结果是(NaN,NaN)
,或(∞, ∞)
。是的。我以前见过当发现“异常”时返回异常大的整数…例如在有向无环图中,我让教授使用max int来表示∞ (或者从(u,v)开始的任何路径)在某些情况下都可能被认为是不整洁的。不管怎样,我认为返回不满足“交叉点”的对象的第二种选择在大多数情况下是理想的。。。