簡體   English   中英

如何在 Java 中創建一個可以同時用於成功和錯誤響應的多態結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM