是否有更优雅的方式来编写此构建器?



我的代码片段:

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

是否有更好/更有效的方法来写这个块没有条件阻塞(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();

那么分支与else的区别在于调用了一个额外的codecs方法。这将驱动可用选项:

  1. 如果您想保持单一表达式,检查null是可能传递到codecs。如果是,则使用条件表达式as对codecs的论证:

    .codecs(logger.isDebugEnabled() ? /*logging codec*/ : null)
    
  2. 如果你没有单一的表达或第一选项是不高兴可能的,你还可以提取额外的部分,让普通零件:

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

相关内容

  • 没有找到相关文章

最新更新