Как использовать stringBuilder - PullRequest
0 голосов
/ 11 марта 2020

У меня есть функция и код обзора технического лидера, и я сказал: зачем это заявление 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();
}

Ответы [ 4 ]

2 голосов
/ 11 марта 2020

Указание двух строковых литералов подразумевает отсутствие накладных расходов во время выполнения. Вы можете добиться того же, используя конкатенацию строк, когда все аргументы являются константами времени компиляции. Напротив, использование StringBuilder всегда подразумевает операцию времени выполнения. Вы можете прочитать больше о «StringBuilder лучше, чем + миф» в этом ответе .

Как правило, вы можете уменьшить сложность syntacti c вашего кода:

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));
}

Это подчеркивает, что вы делаете то же самое, только с немного другими данными и используете semanti c из Optional вместо оператора if. И реальный код не нуждается в изменениях, если вы решите экстернализировать фактические строки.

Обратите внимание, что если SalesChannelType является enum, в equals нет необходимости, вы можете просто использовать salesChannelCode == SalesChannelType.HEB_TO_YOU тогда.

1 голос
/ 11 марта 2020

Во-первых, , пожалуйста не используйте необработанные типы. Во-вторых, я не согласен с тем, что использование StringBuilder для создания сообщения является улучшением; однако, так как это то, что вы хотите, я покажу вам, что, вероятно, предполагалось. Что-то вроде

private Optional<String> validatePrimaryPath(SalesChannelType salesChannelCode, 
                List<String> primaryPathList) {
    if (CollectionUtils.isEmpty(primaryPathList)) {
        StringBuilder sb = new StringBuilder(
                    "Customer Hierarchy is mandatory field");
        if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) {
            sb.append(" for HebToYou");
        }
        sb.append(".");
        return Optional.of(sb.toString());
    }

    return Optional.empty();
}

Обратите внимание, что я указал, что метод возвращает Optional<String> и принимает List<String>, когда вы пишете Optional и List без указания типа, тогда вы используете необработанные типы .

1 голос
/ 11 марта 2020

Чтобы предотвратить запись одной и той же (частичной) строкового литерала несколько раз, вы можете:

  • Использовать константу для общей части:

    if (CollectionUtils.isEmpty(primaryPathList)) {
        final String COMMON = "Customer Hierarchy is mandatory field";
        if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) {
            return Optional.of(COMMON + " for HebToYou.");
        } else {
            return Optional.of(COMMON + ".");
        }
    }
    
  • Создайте строку, используя StringBuilder:

    if (CollectionUtils.isEmpty(primaryPathList)) {
        StringBuilder buf = new StringBuilder("Customer Hierarchy is mandatory field");
        if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) {
            buf.append(" for HebToYou");
        }
        return Optional.of(buf.append('.').toString());
    }
    

Лично я бы оставил код в вопросе, особенно если вам когда-нибудь понадобится поддержка не-Engli sh версии текста, потому что на других языках дополнительный текст может отсутствовать go.

0 голосов
/ 11 марта 2020

Лично я думаю, что ваш код в порядке, но у меня есть предложение для этого, если вы все еще хотите использовать StringBuilder

private Optional validatePrimaryPath(SalesChannelType salesChannelCode, List primaryPathList) {
    if (CollectionUtils.isEmpty(primaryPathList)) {
        StringBuilder sb = new StringBuilder("Customer Hierarchy is mandatory field.");
        if (salesChannelCode.equals(SalesChannelType.HEB_TO_YOU)) {
            sb.insert(sb.length()-1, " for HebToYou");
        }
        return Optional.of(sb.toString());
    }
    return Optional.empty();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...