java 动态地更改方法调用,而不使用case语句

8wtpewkr  于 2023-04-10  发布在  Java
关注(0)|答案(2)|浏览(96)

我如何修改下面的代码,使其执行由“some_variable”表示的方法,而不仅仅是“get(uri)”,而不使用case语句?

SimpleHttpRequest http_request = SimpleRequestBuilder.get(uri)
    .setBody(request_body)
    .setHeaders(request_headers)
    .build();

例如,假设String some_variable = "post";,我希望我的程序执行以下操作:

SimpleHttpRequest http_request = SimpleRequestBuilder.post(uri)
    .setBody(request_body)
    .setHeaders(request_headers)
    .build()

因为我想尽可能地减少代码,所以我不想使用if语句或case语句,SimpleRequestBuilder调用应该动态地改变,不管some_variable包含什么值。

wswtfjt7

wswtfjt71#

您可以避免使用ifswitch语句,但它不会在任何显著程度上“最小化”您的代码。
例如,以下方法使用函数引用:

Map<String, Consumer<URI>> method_mapping = new HashMap<>() {{
   put("get", SimpleRequestBuilder::get);
   put("post", SimpleRequestBuilder::post);
}}

SimpleHttpRequest http_request = method_mapping.get(method)(uri)
    .setBody(request_body)
    .setHeaders(request_headers)
    .build();

但这或多或少相当于一个switch语句或一串if语句。而且...更复杂,IMO。
无论some_variable包含什么值,SimpleRequestBuilder调用都应该动态更改。
在可能的范围内,上面的Map方法做到了这一点。但问题是,如果method_mapping没有特定方法字符串的条目,那么没有方案能够处理这一点。
(The代码应该真正测试method_mapping.get(method)在尝试调用它之前返回非空函数引用。
下面是一个使用Java 12+ switch表达式的版本:

Consumer<URI> request_builder = switch(method) {
    case "get" -> SimpleRequestBuilder::get;
    case "post" -> SimpleRequestBuilder::post;
    default -> DummyBuilder::error405;
}
request_builder(uri)
    .setBody(request_body)
    .setHeaders(request_headers)
    .build();

其中DummyBuilder::error405处理不支持的方法的情况。

lmvvr0a8

lmvvr0a82#

您可以使用反射,但它不会很优雅。
您可以通过首先创建请求,然后应用通用代码来最小化代码:

SimpleHttpRequest http_request = (some_variable.equals("post") ? SimpleRequestBuilder.post(uri) : SimpleRequestBuilder.get(uri))
  .setBody(request_body)
  .setHeaders(request_headers)
  .build();

相关问题