当返回值不是布尔值时,确定方法成功

时间:2014-04-18 11:42:29

标签: java language-agnostic control-flow

编程时,我尝试将我的代码模块化为尽可能小的聚焦方法,有时这会成为一个问题,因为如果我处于某个I / O循环中,并且某些方法无法获取所请求的数据,那么我就可以'如果我有一个大方法,就像我可以一样轻松控制返回值的流量。

大多数方法通过返回一个表示成功的布尔值来解决这个问题,但我的问题是,当返回一个重要对象的方法成功/失败时,最佳做法是什么?

考虑以下java代码:

public JSONObject toJSONObjectForServer() { 
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put(KEY_TASKTYPE, _taskType);
        jsonObject.put(KEY_TIMESTAMP, _timestamp);
        jsonObject.put(KEY_TASKSCORE, _taskScore);
        jsonObject.put(KEY_UNITSCONSUMED, _unitsConsumed);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return jsonObject;
}

如果由于某种原因失败,将返回一个空的JSONObject。将错误检测推迟到调用方法,使我必须编写丑陋的东西,如:

JSONObject result = x.toJSONObjectForServer();
    if (result.has(KEY_TASKTYPE))
         // method success
    else // method failure

以这种方式处理结果并不是不言自明的。我可以为每种返回类型定义一个新类:

public class JSONObjectForServerResult { 
    private JSONObject _object;
    private boolean _result;

    public JSONObject getObject { return _object; }
    public boolean getResult { return _result; } 

    // ctor
}

然后让调用者这样:

    // some method
    JSONObjectForServerResult forServerResult = x.toJSONObjectForServer();
    if (forServerResult.getResult())
         // method success
    else // method failure

但这似乎令人费解并且做了很多工作。

在以这种方式控制流量/错误处理时,我是否缺少某些内容?

谢谢!

2 个答案:

答案 0 :(得分:3)

我不明白为什么你首先要抓住这个例外。你能不抛出JSONException并让调用者处理错误吗?

答案 1 :(得分:2)

正如另一个答案建议的那样,您可以简单地使用异常处理来指示何时出错并且没有结果。事实上,这是为什么设计了例外。

但是,在某些语言中,包括Java 8,有一种机制类似于你提出的“每个返回类型的新类”,但是通常都是这样做的,这样你就不必自己编写代码了。每种类型都不需要新的。

在Haskell中,这是Maybe monad。在Scala中它是Option,并且在 Java 8,它是Optional