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

如何重构Java中可能返回2种不同类型对象的代码,java,refactoring,optional,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"); } } cat

因此,我编写了一段代码,如下所示:

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());
}
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());
}
问题是,我有很多与
code block#1
非常相似的代码,我想重构所有这些。问题在于此代码块可以返回:

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

  • 直接创建
    ClassA
    对象
注意:

  • ClassB
    id不是
    ClassA
  • 我在示例中使用字符串作为
    ClassA
    构造函数参数,但实际代码没有使用字符串
我想买一些像这样的东西:

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());
}
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
可选的
,但我不确定是否以及如何在这里使用它

需要澄清的一些背景:
这段代码是关于返回Java Play
结果的。例如,当用户使用公开的API请求特定对象时,它会执行一些关于用户权限、请求有效性和其他内容的测试。如果一个测试失败,它将返回一个
play.Result
,其中包含相应的HTTP.Status、错误代码、错误消息等。如果每个测试都通过,它将返回请求对象的json表示以及HTTP 200状态。

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

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

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");
    }
}

在第一个块中,返回
Optional.empty()
,。否则
Optional.of(myObject)
。用法如下:
方法(a).ifPresent(my->…)
我想我在这里遗漏了一些东西,因为
tryToGetObject(param1)
将返回
ClassB
对象,行
是否会返回tryToGetObject(param1).orElse(新的ClassA(“它为null”)使编译失败?因为在我看来,如果
tryToGetObject()
有效,这一行可以返回
ClassB
对象,如果失败,这一行可以返回
ClassA
对象?@Tom对不起,我已经编辑了我的答案,你必须使用
object
作为返回类型,或者使用另一个公共超类。然后测试返回对象的类?我不确定我对此是否满意,但我觉得你给了我很多线索来回答我的问题,所以谢谢你,这是一个公认的答案@Tom我意识到如果ClassB不是ClassA的子类,这可能不是最好的方法,你能澄清一下吗?事实上ClassB不是ClassA的子类,我将编辑我的问题来说明这一点。这段代码是关于返回Java Play
结果的。例如,当用户使用公开的API请求特定对象时,我会对用户的权限、请求的有效性以及其他内容执行一些测试。如果一个测试失败,我将返回一个
play.Result
,其中包含相应的HTTP.Status、错误代码等等。如果每个测试都通过,我将返回请求对象的json表示以及HTTP 200状态。