java - 如何使用动态字段围绕枚举创建包装类
问题描述
我目前正在开发一个 android 项目,我使用枚举来动态创建 URL。
根据RequestOperation
选择并传递给我的startRequest()
方法,将调用另一个 API,因此对于映射,我的旧方法是通过 switch case 映射枚举值并将相应的 url 部分作为字符串返回,如下所示:
public enum RequestOperation {
WORKERS,
ERRORS_COMPACT,
ERRORS_COMPLEX,
ERROR_TAKE_OVER,
SESSION_CHECK,
SESSION_LOGIN,
SESSION_LOGOUT;
public String parsingKey() {
switch (this) {
case WORKERS:
return "workers";
case ERRORS_COMPACT:
return "errors";
case ERRORS_COMPLEX:
return "errors";
case ERROR_TAKE_OVER:
return "take_over";
default:
return "";
}
}
public String apiURL(ArrayList<String> params) {
switch (this) {
case WORKERS:
return "schedule.m";
case ERRORS_COMPACT:
return "errors.m?mode=compact";
case ERRORS_COMPLEX:
return "errors.m?mode=complex";
case ERROR_TAKE_OVER:
return "assign_task.m?param0=" + params.get(0) + "¶m1=" + params.get(1);
case SESSION_CHECK:
return "desk.m?do=check¶m0=" + params.get(0);
case SESSION_LOGIN:
return "desk.m?do=login¶m0=" + params.get(0) + "¶m1=" + params.get(1) + "¶m2=" + params.get(2);
case SESSION_LOGOUT:
return "desk.m?do=logout¶m0=" + params.get(0);
default:
return "";
}
}
}
如您所见,url 字符串的组成非常粗略,我对此没有信心。为了找到一种创建方法,我尝试在枚举周围创建一个包装类:
public class RequestOperation {
public enum Type {
WORKERS("workers", "workers.m"),
ERRORS_COMPACT("errors", "errors.m?mode=compact"),
ERRORS_COMPLEX("errors", "errors.m?mode=complex"),
//here's where im stuck, cause the second string is not the complete url
ERROR_TAKE_OVER("take_over", "assign_task.m?param0="),
SESSION_CHECK("", "desk.m?do=check&dparam0="),
SESSION_LOGIN("", "desk.m?do=login¶m0="),
SESSION_LOGOUT("", "desk.m?do=logout¶m0=");
//maybe pass the params in here some how, and compose the url selectively
Type(String parsingKey, String applicationUrl) {
this.parsing_key = parsingKey;
this.application_url = applicationUrl;
}
//maybe move them out of the enum
private String parsing_key;
private String application_url;
//private ArrayList<String> url_params = new ArrayList<>();
}
private Type type;
//expect parameters from the creator here maybe
public RequestOperation(Type type) {
this.type = type;
}
public String parsingKey() {
return type.parsing_key;
}
public String application_url() {
return type.application_url;
}
}
现在我的问题是,我不知道如何将参数传递给RequestOperation
对象,以便application_url
正确组合。我的第一个想法是,重载 的构造函数Type
,这样我最多可以传递 3 个字符串,这些字符串将像第一个展览中一样填充空白。有什么办法可以做到这一点,而且这是一个好习惯吗?
解决方案
我不会像?param0=
在枚举声明中那样使用参数,而是在枚举中保留原始 url。
例如这个枚举常量:
ERROR_TAKE_OVER("take_over", "assign_task.m?param0=")
改成:
ERROR_TAKE_OVER("take_over", "assign_task.m")
你apiURL(String...)
可能看起来像这样:
public String apiURL(String... params) {
if(params.length == 0) return type.application_url;
return type.application_url
+ "?"
+ IntStream.range(0, params.length)
.mapToObj(i -> String.format("param%d=%s", i, params[i]))
.collect(Collectors.joining("&"));
}
并让 webservlet 处理可能的参数缺失。
例子:
RequestOperation request = new RequestOperation(RequestOperation.Type.ERROR_TAKE_OVER);
System.out.println(request.apiURL()); //"assign_task.m"
System.out.println(request.apiURL("a")); //"assign_task.m?param0=a"
System.out.println(request.apiURL("a", "b", "c")); //"assign_task.m?param0=a¶m1=b¶m2=c"
推荐阅读
- javascript - 如何在 Css 中使用 @media 移动对象?
- python - matplotlib:将 3d 图适合固定大小的图形
- ios - 使用 firebase 函数向 firebase 发送时间戳
- c++ - 在 gtk + cpp 应用程序中使用 CImg 和 OpenCv 库
- android - Android SDK Emulator 是在主机上挂载文件系统还是模拟挂载?
- blockchain - 如何获取chainlink api调用的oracle id?
- php - 在创建关于我们的交替横向页面时遇到问题
- python - 当两个用户同时运行 C 扩展时 Django 崩溃
- django - 使用独家 sub_service 制作添加到购物车服务的模型理念
- python - 在 Python 中,为什么我不能为 str 类设置属性?