首页 > 解决方案 > 如何使用字符串生成器

问题描述

我有一个功能和技术负责人审查代码并说:为什么这个if语句?这基本上是相同的消息。如果要自定义,请使用带有类型的字符串生成器。如何更改它,有人可以帮助我吗?

private Optional<String> validatePrimaryPath(SalesChannelType salesChannelCode, List<String> primaryPathList) {

  if (CollectionUtils.isEmpty(primaryPathList)) {
    if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) {
      return Optional.of("Customer Hierarchy is mandatory field for HebToYou.");
    } else {
      return Optional.of("Customer Hierarchy is mandatory field.");
    }
  }

  return Optional.empty();
}

标签: javastringoptionalstringbuilderstringbuffer

解决方案


指定两个字符串文字意味着没有运行时开销。当所有参数都是编译时常量时,您可以使用字符串连接来实现相同的目的。相反,使用StringBuilderalways 意味着运行时操作。您可以在此答案中阅读有关“<code>StringBuilder 比+神话更好”的更多信息。

您通常可以降低代码的语法复杂性:

private Optional<String> validatePrimaryPath(
    SalesChannelType salesChannelCode, List<String> primaryPathList) {

    final String prefix = "Customer Hierarchy is mandatory field";
    final String general = prefix + ".", forHebToYou = prefix + " for HebToYou.";

    return Optional.of(
            salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)? forHebToYou: general)
        .filter(s -> CollectionUtils.isEmpty(primaryPathList));
}

这强调您正在做同样的事情,只是数据略有不同,并使用语义Optional而不是if语句。如果您决定将实际字符串外部化,则实际代码不需要更改。

请注意,如果SalesChannelTypeenum,则不需要equals,您可以使用salesChannelCode == SalesChannelType.HEB_TO_YOUthen 。


推荐阅读