0

我认为这是一个简单但重要的问题。

我正在编写一个带有函数的类:

public MyClass myFunction(MyClass mc) { ... }

在这个函数中,它改变了 mc 的一些状态并将其返回。我知道这没有必要,因为 mc 已经到位。我要返回 MyClass 的原因是使用 null 表示更新失败。

我可能会将返回类型更改为布尔值并使用 false 来指示错误:

public boolean myFunction(MyClass mc) { ... }

但我记得我很久以前读过一篇文章说这不是一个好习惯(虽然我忘记了细节和原因)。

我当然可以使用异常来表示错误:

public void myFunction(MyClass mc) throws MyException { ... }

但我觉得这太重了。

我个人的观点是,如果错误在系统范围内有意义,那么应该使用异常。如果错误只对调用者和函数有意义,则不应使用异常。但是在这种情况下我应该使用 null 或 false 来指示错误吗?

您认为最佳做法是什么?请让我知道你的意见。

非常感谢。

4

4 回答 4

5

失败是更新过程的预期部分吗?还是只有当一切都发生灾难性错误时才会发生?

如果这是一个真正的异常情况,那么您应该更喜欢使用异常。这类事情的返回值往往会被忽略(看看一些可怕的布尔返回File函数,比如mkdirs

如果失败是尝试进行更新的预期部分,那么您应该返回布尔值或某种状态对象。

于 2012-04-22T17:52:02.937 回答
0

通常不赞成的做法是使用某种返回代码(一个 int 等)来代替引发异常。如果更新失败是“正常”行为,则返回布尔值即可。例如,Collection.add 就是这样做的。

于 2012-04-22T17:58:45.087 回答
0

从您列出的三个选项中,我不会使用第一个。

public MyClass myFunction(MyClass mc) { ... }

在这种情况下,myFunctions 要么返回它的参数 (mc),要么返回 null - 只有两个选项可用,所以它基本上与

public boolean myFunction(MyClass mc) { ... }

正如 Steven Schlansker 所说,您应该决定失败的更新是否真的是异常状态,还是应该由用户处理的预期状态。

还有一点需要注意:如果您决定将其实现为返回布尔值(不抛出异常)的方法,那么我建议您可以确定对MyClass mc对象没有更改或所有更改。

例如,如果 myFunction 应该更新 MyClass 中的 3 个字段 ( x,y,z )。如果您调用myFunction(mc)并且它能够更新其中两个(x,y )并且在更新第三个( z )时失败,则它返回false。然后您的MyClass mc对象处于不一致状态,因为x 和 z已更新,但z没有。如果用户决定继续使用现有的mc对象,这可能会导致进一步的问题。如果您决定将myMethod实现为引发异常的方法,则可能更容易理解该对象可能处于无效状态。

于 2012-04-22T19:31:58.660 回答
0

这取决于调用者函数。

如果调用者函数需要该对象的值

             then you should return Null in case of failure 
             and return the OBJECT in case  of success

如果调用者函数只需要对象的状态是否更新

             then return true in case of success 
             and return false in case of failure
于 2015-10-22T06:12:41.737 回答