[英]How to create a polymorphic structure that can work for both success and error responses in Java?
我正在研究一個類,它將獲取字符串列表並使用 CompletableFutures 異步處理它們。 每個字符串都通過調用另一個類來處理,該類將執行多個操作並在出現錯誤時返回響應或拋出異常。 我想匯總我得到的響應,無論它們是有效響應還是異常,並將它們作為列表返回給調用者。 我希望調用者能夠期待SomeResponse
列表並能夠使用多態來解釋它們。
但是,鑒於成功和錯誤響應的字段完全不同,我一直在確定這是否可以使用多態來完成。 我在下面的一個我想到的替代方案上添加了一些偽代碼。 基本上讓SomeResponse
是一個帶有isSuccess
方法的接口。 這將允許調用者知道它是否是一個錯誤。 但是,調用者仍然必須將其轉換為正確的實現才能獲得值或錯誤。 有沒有更好的方法來解決這個問題? 我的要求是能夠為列表中的每個給定請求返回成功和錯誤響應。 如果出現異常,我們不想中止整個操作。
public MyProcessorClass {
private final SomeOtherClass someOtherClass;
public List<SomeResponse> process(List<String> requestList) {
return requestList.stream().map(this::procesRequest)
.collectors(Collect.tolist()):
}
private processRequest(String request) {
CompletableFuture completableFuture = CompletableFuture
.supplyAsync(() => {
return new SomeSuccessResponse(someOtherClass.execute(request));
})
.exceptionally(e -> {
return new SomeErrorResponse(e.getCause);
});
return completableFuture.get();
}
}
public interface SomeResponse {
boolean isSuccess();
}
public class SomeSuccessResponse implements SomeResponse {
private final String value;
@Getter
private final boolean success;
public SomeSuccessResponse(String value) {
this.value = value;
this.success = true;
}
}
public class SomeErrorResponse implements SomeResponse {
private final Throwable error;
@Getter
private final boolean success;
public SomeErrorResponse(Throwable error) {
this.error = error;
this.success = false;
}
}
你想要的是訪問者模式https://en.wikipedia.org/wiki/Visitor_pattern
public class Main {
interface IResponse {
void acceptHandler(IResponseHandler handler);
}
static class ResponseA implements IResponse {
@Override
public void acceptHandler(IResponseHandler handler) {
handler.handle(this);
}
}
static class ResponseB implements IResponse {
@Override
public void acceptHandler(IResponseHandler handler) {
handler.handle(this);
}
}
public interface IResponseHandler {
void handle(ResponseA response);
void handle(ResponseB responseB);
}
public static void main(String[] args) {
final IResponseHandler handler = new IResponseHandler() {
@Override
public void handle(ResponseA response) {
System.out.println("Handle ResponseA");
}
@Override
public void handle(ResponseB responseB) {
System.out.println("Handle ResponseB");
}
};
final IResponse someResponse = new ResponseA();
someResponse.acceptHandler(handler);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.