如何围绕具有动态字段的枚举创建包装器 class
How to create a wrapper class around an enum with a dynamic field
我目前正在做一个 android 项目,我在其中使用枚举来动态创建 URL。
根据选择哪个 RequestOperation
并传递给我的 startRequest()
方法,将调用另一个 API,因此对于映射,我的旧方法是映射枚举值通过一个开关盒和 return 相应的 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 字符串的编码非常粗糙,我对此没有信心。为了找到创建这些方法的方法,我尝试在枚举周围创建一个包装器 class:
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 个字符串,它们将像第一个展览中那样填充空白。有什么办法可以做到这一点吗?这也是一种好的做法吗?
这可能不是最佳解决方案,只是一种解决方法。理想情况下,enum
应该存储 常量 值而不是动态值。在您的情况下,解决方法是使用 MessageFormat#format()
。 enum
中的 application_url
值将包含带有占位符的字符串:
SESSION_LOGIN("", "desk.m?do=login¶m0={0}¶m1={1}")
请注意使用 {}
作为占位符。
现在创建一个方法,根据传递的参数形成 URL 作为:
public String getApiUrl(String... params) {
return MessageFormat.format(this.application_url, params);
}
请注意,这是一种非常粗略的方法来完成您想要实现的目标,因为它没有检查可以传递的参数的内容或数量。
我不会在枚举声明中使用 ?param0=
之类的参数,而是将原始网址保留在枚举中。
例如这个枚举常量:
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"
我目前正在做一个 android 项目,我在其中使用枚举来动态创建 URL。
根据选择哪个 RequestOperation
并传递给我的 startRequest()
方法,将调用另一个 API,因此对于映射,我的旧方法是映射枚举值通过一个开关盒和 return 相应的 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 字符串的编码非常粗糙,我对此没有信心。为了找到创建这些方法的方法,我尝试在枚举周围创建一个包装器 class:
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 个字符串,它们将像第一个展览中那样填充空白。有什么办法可以做到这一点吗?这也是一种好的做法吗?
这可能不是最佳解决方案,只是一种解决方法。理想情况下,enum
应该存储 常量 值而不是动态值。在您的情况下,解决方法是使用 MessageFormat#format()
。 enum
中的 application_url
值将包含带有占位符的字符串:
SESSION_LOGIN("", "desk.m?do=login¶m0={0}¶m1={1}")
请注意使用 {}
作为占位符。
现在创建一个方法,根据传递的参数形成 URL 作为:
public String getApiUrl(String... params) {
return MessageFormat.format(this.application_url, params);
}
请注意,这是一种非常粗略的方法来完成您想要实现的目标,因为它没有检查可以传递的参数的内容或数量。
我不会在枚举声明中使用 ?param0=
之类的参数,而是将原始网址保留在枚举中。
例如这个枚举常量:
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"