Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中返回对象的最佳实践_Java_Design Patterns - Fatal编程技术网

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

在java中返回对象的最佳实践,java,design-patterns,Java,Design Patterns,假设我们有一个名为intersect的类,它有一个findIntersect(line1,line2)方法。它返回一个名为point的对象,其中包含两个字段x和y坐标。现在,如果输入是两条平行线,那么与用户进行通信的最佳方式是什么?虽然这个例子是特定于行的,但问题是通用的——假设一个方法返回值对象,如果条件不匹配,返回什么?有些选择是: Returnnull(问题:在许多地方阅读,如果可能,应避免使用null返回值) 在对象中有一个确定对象是否有效的方法,类似于迭代器中的hasNext() 抛出

假设我们有一个名为intersect的类,它有一个
findIntersect(line1,line2)
方法。它返回一个名为
point
的对象,其中包含两个字段
x
y
坐标。现在,如果输入是两条平行线,那么与用户进行通信的最佳方式是什么?虽然这个例子是特定于行的,但问题是通用的——假设一个方法返回值对象,如果条件不匹配,返回什么?有些选择是:

  • Return
    null
    (问题:在许多地方阅读,如果可能,应避免使用null返回值)
  • 在对象中有一个确定对象是否有效的方法,类似于
    迭代器中的
    hasNext()
  • 抛出一个
    异常

  • 请让我知道最好的方法。

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

    在这种情况下,我可能会返回一个
    Optional
    非常好,因为它非常清楚地表明可能不存在值。如果sane API声明的返回类型为
    可选
    ,则该API将永远不会–永远–返回
    null

    更多阅读:和

  • 在返回空值时应该非常小心。您的API用户将不得不使用空检查使其代码膨胀
  • 一个好的解决方案,让一个对象决定它是否处于有效状态。如果不是,则默认为预定义状态
  • 一个可能的解决方案,如果它在您的API中有意义的话。例如:是否允许用户通过2条平行线
    你的第二个选择似乎很理想

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

    异常通常仅在执行内部计算(试图读取不存在的文件、特定变量的格式等)时才会引发。引发异常会提醒用户执行了非法操作……未找到交集并不意味着找到了非法操作,而是返回false

    首先调用布尔函数来测试是否存在特定的交集,如果存在交集,然后调用下一个函数来查找交集,这将更加“干净”

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


    希望这能有所帮助。

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

    就我个人而言,我喜欢空值。如果您无论如何都要检查有效性,空检查是快速、简单的,并且对任何编码人员都是可读的。只要我的两分钱。如果您使用的是
    float
    ,则可以返回
    float.NaN
    ,但也可以在文档中解释它。请投票记录它。只要我能很容易地说出什么是回报,我就很高兴。始终记录边缘情况。无论您是否有
    checkParallel
    方法,最终都会有人传入两条平行线,您必须以某种方式进行处理。我可能会抛出一个
    ParallelinesException扩展了IllegalArgumentException
    ,但无论您是这样做还是返回某种“无效”值,都应该确切地指定您的代码约定是什么。我知道它更容易阅读,但1和2每次都需要检查一个变量,因此,代码几乎同样会被它弄乱。可能的话,但是如果你
    确定
    返回的对象将始终处于有效状态,你就不需要真正的防御检查之类的。“调用布尔函数来首先测试是否存在某个特定的交集,如果存在,然后调用下一个函数来找到它,这会更“干净”我不同意。我认为这一点都不干净,而且它做的工作是原来的两倍。此外,表示无交点的对象不能具有实值坐标(例如
    (-1,-1)
    ),因为实际笛卡尔平面无限大。我能看到的唯一合理的“空对象”结果是
    (NaN,NaN)
    ,或
    (∞, ∞)
    。是的。我以前见过当发现“异常”时返回异常大的整数…例如在有向无环图中,我让教授使用max int来表示∞ (或者从(u,v)开始的任何路径)在某些情况下都可能被认为是不整洁的。不管怎样,我认为返回不满足“交叉点”的对象的第二种选择在大多数情况下是理想的。。。