如何重构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
id不是ClassB
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状态。