这可能不是最好的解决方案,而只是一种解决方法。理想情况下, enum 应该存储 的 不变 强> 价值而非动态价值。在您的情况下,解决方法是使用 MessageFormat#format() 。该 application_url 价值 enum 将包含带占位符的字符串:
enum
MessageFormat#format()
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= 在枚举声明中,而是将原始网址保留在枚举中。
?param0=
例如这个枚举常量:
ERROR_TAKE_OVER("take_over", "assign_task.m?param0=")
改成:
ERROR_TAKE_OVER("take_over", "assign_task.m")
和你的 apiURL(String...) 可能看起来像这样:
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("&"));
}
例:
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"