如何重构可能返回Java中2种不同类型对象的代码

时间:2018-08-15 08:57:38

标签: java refactoring optional

所以我写了一个看起来像这样的代码:

public ClassA myMethod(param1) {
    ClassB myObject;

    //START of code block #1
    try {
        myObject = tryToGetObject(param1);
        if (myObject == null) {
            return new ClassA("it's null");
        }
    } catch (ParamNotValidException e) {
        return new ClassA("param1 is not valid");
    }
    //END of code block #1

    /**
    Here do a lot of things with myObject
    */

    return new classA(myObject.toString());
}

问题是,我有很多与code block #1类似的代码,我想重构所有这些代码。问题在于此代码块可以返回:

  • myObject,稍后将使用它构建一个ClassA对象以返回

OR

  • 直接是一个ClassA对象。

NB:

  • ClassB id 不是 ClassA
  • 的子类
  • 在示例中,我将String用作ClassA构造函数参数,但实际代码未使用Strings。

我想得到的东西种类像这样:

public ClassA method(param1) {
    ClassB myObject;

    //START of code block #1
    getMyObjectOrReturnClassAObject();
    //END of code block #1

    /**
    Here do a lot of things with myObject
    */

    return new classA(myObject.toString());
}

我试图研究Java Optional,但不确定在这里是否以及如何使用它。

一些需要澄清的上下文: 这段代码是关于返回Java Play Result的。例如,当用户使用公开的API请求特定对象时,它将执行有关用户权限,请求的有效性以及其他事项的一些测试。如果一个测试失败,它将返回带有适当HTTP.Status,错误代码,错误消息等的play.Result。如果每个测试通过,它将返回所请求对象的json表示形式以及HTTP 200状态。

1 个答案:

答案 0 :(得分:0)

您已经建议使用Optional,这是一个很好的方向。

首先,在使用tryToGetObject(param1)Optional<Object>的同时修改Optional.of()以返回Optional.ofNullable()。然后,您可以执行以下操作:

myObject = tryToGetObject(param1).orElse(new ClassA("it's null"));

您可以将其包装在另一种方法中以消除异常:

private Object getMyObjectOrReturnClassAObject(Object param1) {
    try {
        return tryToGetObject(param1).orElse(new ClassA("it's null"));
    catch(ParamNotValidException e) {
        return new ClassA("param1 is not valid");
    }
}