有没有更优雅的方式来编写这个构建器?

is there a more elegant way to code this builder?

这是我的代码片段

WebClient webClient;
    if (logger.isDebugEnabled()) {
        webClient = WebClient.builder() //
                .baseUrl(eprBaseUrl) //
                .codecs(codecConfigurer -> {
                    codecConfigurer.defaultCodecs().jackson2JsonEncoder(loggingEncoder);
                }) //
                .build();
    } else {
        webClient = WebClient.builder() //
                .baseUrl(eprBaseUrl) //
                .build();
    }

我的问题很快暴露了: 有没有 better/more 有效的方法来写这个块 没有条件块 (if/else)

提前致谢

您可以像这样提取相关部分:

WebClient.Builder webClientBuilder = WebClient.builder().baseUrl(eprBaseUrl);
if (logger.isDebugEnabled()) {
  webClientBuilder.codecs(codecConfigurer -> {
     codecConfigurer.defaultCodecs().jackson2JsonEncoder(loggingEncoder);
  });
}
WebClient webClient = webClientBuilder.build();

您可以初始化您的构建器直到 if 块并仅将 .codecs 设置到 if 部分:

    WebClient.Builder webClientBuilder = WebClient.builder();
    if (logger.isDebugEnabled()) {
        webClientBuilder
                .codecs(codecConfigurer -> {
                    codecConfigurer.defaultCodecs().jackson2JsonEncoder(loggingEncoder);
                });
    }
    webClientBuilder
            .baseUrl(eprBaseUrl)
            .build();

Then 分支与 else 的不同之处在于调用了一个额外的 codecs 方法。此驱动器可用选项:

  1. 如果你想保持单一表达式,检查 null 是否是 可以传递给 codecs。如果是,则使用条件表达式作为 codecs 的参数:

        .codecs(logger.isDebugEnabled() ? /*logging codec*/ : null)
    
  2. 如果你开心没有单一表情或者第一个选项不是 可能的话,你仍然可以提取额外的部分并让 common 部分在一起:

        WebClient.Builder builder = WebClient.builder() //
                    .baseUrl(eprBaseUrl);
        if(logger.isDebugEnabled())
          builder.codecs(/*logging codec*/);
        webClient = builder.build();