焦茶/夏コミ本に収録です 小宇宙
338 字
2 分钟
使用泛型约束 SDK 的出入参
前言
刷视频看到一种使用泛型约束,在 Request 中绑定 Response,从而简洁优雅地实现灵活扩展请求参数和返回参数,这种方式在 SDK 源码中很常见,比较简单实用,觉得有点意思,写个 demo 分享一下
Demo
Response
@Getter@Setterpublic abstract class BaseResponse { private int statusCode;}@Getter@Setterpublic class Example1Response extends BaseResponse { private String response1;}
@Getter@Setterpublic class Example2Response extends BaseResponse { private String response2;}Request
定义 BaseRequest,使用泛型指定返回类型为 BaseResponse 的子类
@Getter@Setterpublic abstract class BaseRequest<T extends BaseResponse> {
private String code;
public abstract Class<T> getResponseType();}Request 指定返回的具体 Response 类型
@Getter@Setterpublic class Example1Request extends BaseRequest<Example1Response> {
private String example1;
@Override public Class<Example1Response> getResponseType() { return Example1Response.class; }}
@Getter@Setterpublic class Example2Request extends BaseRequest<Example2Response> {
private String example2;
@Override public Class<Example2Response> getResponseType() { return Example2Response.class; }}Client
public class ExampleClient {
private String postRequest(String param) { try (HttpResponse response = HttpUtil.createPost("https://api.demo.com/api").body(param).execute()) { if (response.isOk()) { return response.body(); } else { System.err.println("HTTP请求失败,状态码: " + response.getStatus()); return null; } } catch (Exception e) { System.err.println("发送HTTP请求时发生异常: " + e.getMessage()); return null; } }
public <T extends BaseResponse> T execute(BaseRequest<T> request) { String result = postRequest(JSONUtil.toJsonStr(request)); // 根据 request 绑定的响应类型转换 result return JSONUtil.toBean(result, request.getResponseType()); }}Example
在使用 execute 方法的时候,根据请求参数的不同,自动返回对应的响应类型
public static void main(String[] args) { ExampleClient exampleClient = new ExampleClient();
Example1Request example1Request = new Example1Request(); Example1Response execute1 = exampleClient.execute(example1Request); Example2Request example2Request = new Example2Request(); Example2Response execute2 = exampleClient.execute(example2Request);}