我认为这是一个容易但重要的问题。
我正在编写一个带有函数的类:
public MyClass myFunction(MyClass mc) { ... }
在此函数中,它会更改mc的某些状态并将其返回。我知道没有必要因为mc是变化的。我想返回MyClass的原因是使用null来表示更新失败。
我可能会将返回类型更改为boolean并使用false来指示错误:
public boolean myFunction(MyClass mc) { ... }
但我记得很久以前我读过一篇文章说这不是一个好习惯(虽然我忘了细节和原因)。
我当然可以使用异常来表示错误:
public void myFunction(MyClass mc) throws MyException { ... }
但我觉得这太重了。
我个人认为,如果错误在系统范围内有意义,那么应该使用异常。如果错误仅对调用者和函数有意义,则不应使用异常。但在这种情况下,我应该使用null或false来表示错误吗?
您认为最佳做法是什么?请让我知道你的意见。
非常感谢。
答案 0 :(得分:5)
故障是否是更新过程的预期部分?或者只有在一切都发生灾难性错误时才会发生?
如果这是一个真正特殊的情况,那么你应该更喜欢使用例外。这种事情的返回值往往会被忽略(只需看看一些可怕的布尔返回File
函数,如mkdirs
)
如果失败是尝试进行更新的预期部分,那么您应该返回布尔值或某种状态对象。
答案 1 :(得分:0)
通常不赞成的做法是使用某种返回代码(int或类似代码)来代替抛出异常。如果失败的更新是“正常”行为,则返回布尔值就可以了。例如,Collection.add就是这样做的。
答案 2 :(得分: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 实现为方法trowing异常,则可能更容易理解该对象可能处于无效状态。
答案 3 :(得分: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