如何从其他类获取数据对象?回调返回值与响应对象处理咨询
几种标准解决方案
针对你需要同时获取处理状态和响应数据的场景,有几种主流的标准写法可以替代现有方案:
1. 封装结果对象(最常用)
定义一个专门的类,把返回码和Response打包在一起,让callback方法直接返回这个复合对象,既避免了输出参数的写法,又能同时拿到两个关键数据。
示例代码:
// 定义结果封装类 public class CallbackResult { private int status; // 对应原来的0-5状态码 private Response response; // 构造方法、getter/setter 省略 public CallbackResult(int status, Response response) { this.status = status; this.response = response; } // getter方法 public int getStatus() { return status; } public Response getResponse() { return response; } } // 调用方式 CallbackResult result = listener.callback(); if (result.getStatus() == 0) { Response response = result.getResponse(); // 处理响应 } else if (result.getStatus() == 1) { // 其他逻辑 } else { // 错误处理 }
这种方式完全符合面向对象的设计思路,把相关的数据和状态聚合在一起,代码可读性和维护性都更好。
2. 用枚举替代魔法数字状态码
如果觉得状态码用数字不够直观,可以先把0-5这些状态定义成枚举,再结合上面的封装类,或者保留原有的输出参数写法但返回枚举类型,让代码更易读。
示例代码:
// 定义状态枚举 public enum CallbackStatus { SUCCESS(0), RETRY(1), INVALID_PARAM(2), TIMEOUT(3), PERMISSION_DENIED(4), ERROR(5); private final int code; CallbackStatus(int code) { this.code = code; } public int getCode() { return code; } } // 封装类结合枚举 public class CallbackResult { private CallbackStatus status; private Response response; // 构造方法和getter public CallbackResult(CallbackStatus status, Response response) { this.status = status; this.response = response; } public CallbackStatus getStatus() { return status; } public Response getResponse() { return response; } } // 调用时的判断更直观 CallbackResult result = listener.callback(); if (result.getStatus() == CallbackStatus.SUCCESS) { // 处理响应 } else if (result.getStatus() == CallbackStatus.RETRY) { // 重试逻辑 } else { // 错误处理 }
枚举的方式消除了魔法数字,别人看代码时不用猜每个数字代表什么含义,团队协作时更友好。
3. 基于异常的分支处理(适合少数异常场景)
如果大部分状态是成功,只有少数几种是错误/特殊情况,可以考虑让callback方法正常返回Response,特殊情况抛出对应的自定义异常。但这种方式只适合状态码中错误场景较少的情况,不要把正常业务分支用异常来处理(违反异常的设计初衷)。
示例代码:
// 自定义异常 public class RetryException extends Exception {} public class CallbackErrorException extends Exception {} // listener的callback方法定义 public Response callback() throws RetryException, CallbackErrorException { Response response = new Response(); // 处理逻辑 if (成功条件) { return response; } else if (需要重试) { throw new RetryException(); } else { throw new CallbackErrorException(); } } // 调用方式 try { Response response = listener.callback(); // 处理成功的响应 } catch (RetryException e) { // 重试逻辑 } catch (CallbackErrorException e) { // 错误处理 }
这种方式适合状态分支较少,且特殊分支属于异常情况的场景,不要滥用。
内容的提问来源于stack exchange,提问作者user1506104
相关产品推荐
相关产品推荐

